JavaScriptで配列内の要素間の距離(差分)を求める方法
はじめに
JavaScriptでは、ソート済みの数値配列から各要素同士の差分を求め、それをサブ配列としてまとめたいケースがあります。本記事では、昇順に並んだ数値配列を入力として受け取り、各要素とそれ以降の要素との差分からなるサブ配列を生成する関数の実装方法を解説します。
問題の定義
まず、次のような昇順にソートされた数値配列を例に考えてみましょう。
const arr = [2, 5, 7, 8, 9];
この配列に対して、各要素について「その要素と、それ以降の各要素との差」を計算し、結果をサブ配列として格納していきます。
最初の要素「2」の場合
先頭の要素 2 と、それ以降の要素との差は以下のようになります。
5 - 2 = 3 7 - 2 = 5 8 - 2 = 6 9 - 2 = 7
したがって、最初の要素に対応するサブ配列は次の通りです。
[3, 5, 6, 7]
2番目以降の要素の場合
同じ要領で、2番目の要素 5 以降の差分は次のようになります。
[2, 3, 4]
3番目の要素 7 の場合:
[1, 2]
4番目の要素 8 の場合:
[1]
最後の要素 9 は、それ以降に比較対象となる要素が存在しないため、サブ配列は生成されません。
期待される出力
以上をまとめると、配列全体に対する出力は次のようになります。
const output = [
[3, 5, 6, 7],
[2, 3, 4],
[1, 2],
[1]
];実装コード
この処理を実現するJavaScriptのコードは以下の通りです。再帰呼び出しを使って、各要素の差分サブ配列を順番に構築していきます。
const arr = [2, 5, 7, 8, 9];
const distanceBetween = (arr, r = []) => {
if (r.length <= arr.length - 2) {
let temp = [];
let b = arr[r.length];
arr.forEach(e => temp.push(e - b));
r.push(temp.filter(e => e > 0));
return distanceBetween(arr, r);
} else {
return r;
}
}
console.log(distanceBetween(arr));コードのポイント
- 基準値の取得:
arr[r.length]により、現在処理中の要素を基準値として取得します。 - 差分の計算:
forEachを使って、基準値と全要素の差を一時配列tempに格納します。 - 正の値のみ抽出:
filter(e => e > 0)によって、自分自身より後ろの要素(差が正になるもの)だけを残します。これにより、配列が昇順ソートされている前提で、後続要素との差分のみが得られます。 - 再帰処理: 結果配列
rの長さがarr.length - 2以下である限り再帰的に処理を続け、最後の要素の手前で終了します。
実行結果
コンソールには次のように出力されます。
[ [ 3, 5, 6, 7 ], [ 2, 3, 4 ], [ 1, 2 ], [ 1 ] ]
まとめ
このように、再帰関数と filter() メソッドを組み合わせることで、ソート済み配列の各要素と後続要素との差分を効率的にサブ配列として抽出できます。配列が昇順にソートされていることが前提となる点に注意してください。もし未ソートの配列を扱う場合は、事前に sort((a, b) => a - b) で並べ替えておくことで、同様のロジックを適用できます。
-
JavaScriptのArray.prototype.find()メソッドとは?使い方をサンプルコードで解説
Array.prototype.find() メソッドは、配列の中から指定した条件(テスト関数)を満たす最初の要素の値を返します。 条件に一致する要素が見つかった時点で検索を終了するため、大きな配列でも効率的に動作します。また、どの要素も条件を満たさなかった場合は undefined を返すという点も重要な特徴です。 find()メソッドの基本構文 arr.find(callback(element[, index[, array]])[, thisArg]) callback:各要素に対して実行されるテスト関数。true を返した要素が結果となります。 thisArg(省略可):callb
-
JavaScript配列で要素を検索する方法を徹底解説!find()メソッドの使い方
JavaScriptで配列の中から特定の要素を検索したい場面は非常に多くあります。本記事では、最もよく使われるfind()メソッドを中心に、実際に動作するサンプルコードとともに分かりやすく解説します。 find()メソッドとは find()メソッドは、配列の各要素に対して指定したテスト関数(コールバック関数)を実行し、条件を満たした最初の要素の値を返します。条件に一致する要素が存在しない場合は undefined を返します。 基本構文 arr.find(callback(element[, index[, array]])[, thisArg]) callback: 各要素をテストする関数