JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで配列内の数値に最も近い要素のインデックスを検索する方法

はじめに

JavaScriptで、配列の中から指定した数値に最も近い要素のインデックスを見つけたい場面はよくあります。例えば、次のような配列があったとします。

const arr = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];

本記事では、このような配列と任意の数値 n を引数として受け取り、n に最も近い要素のインデックスを返す関数の作成方法を解説します。

実装の考え方

基本的なアプローチはシンプルです。配列を先頭から順に走査しながら、各要素と対象の数値との差(絶対値)を計算し、これまでに見つかった最小の差より小さければ、その時点のインデックスと差を記録していきます。走査が完了した時点で保持しているインデックスが、最も近い要素の位置となります。

サンプルコード

以下が実際のコードです。

const arr = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
const closestIndex = (num, arr) => {
   let curr = arr[0], diff = Math.abs(num - curr);
   let index = 0;
   for (let val = 0; val < arr.length; val++) {
      let newdiff = Math.abs(num - arr[val]);
      if (newdiff < diff) {
         diff = newdiff;
         curr = arr[val];
         index = val;
      };
   };
   return index;
};
console.log(closestIndex(150, arr));

コードのポイント

  • 変数 curr に現在の最接近要素を、diff にその差を格納します。
  • ループ内では Math.abs() を使って各要素との絶対的な差を求めます。
  • より小さい差が見つかるたびに、diffcurrindex を更新します。

出力結果

上記のコードをコンソールで実行すると、次の出力が得られます。

4

これは、150 に最も近い要素が arr[4]162 であることを意味しています。

補足:reduce() を使った簡潔な書き方

同様の処理は、Array.prototype.reduce() を使うことでより短く表現できます。

const arr = [2, 42, 82, 122, 162, 202, 242, 282, 322, 362];
const closestIndex = (num, arr) =>
   arr.reduce((best, val, i) =>
       Math.abs(val - num) < Math.abs(arr[best] - num) ? i : best, 0);
console.log(closestIndex(150, arr)); // 4

どちらの方法でも計算量は O(n) となるため、大きな配列に対しても効率的に動作します。

  1. JavaScriptの基本配列メソッド解説!push・pop・shift・unshift・spliceの使い方を実例付きで紹介

    JavaScriptには、配列を操作するための便利な組み込みメソッドが数多く用意されています。その中でも特によく使われるのが、要素の追加や削除を行う以下の5つの基本メソッドです。 JavaScriptの主要な配列メソッド一覧 メソッド説明 Array.push()配列の末尾に要素を追加します。 Array.pop()配列の末尾から要素を取り除きます。 Array.unshift()配列の先頭に要素を追加します。 Array.shift()配列の先頭から要素を取り除きます。 Array.splice()配列内の任意の位置で要素の追加・削除を行います。 これらのメソッドは、配列の

  2. JavaScriptのArray.prototype.find()メソッドとは?使い方をサンプルコードで解説

    Array.prototype.find() メソッドは、配列の中から指定した条件(テスト関数)を満たす最初の要素の値を返します。 条件に一致する要素が見つかった時点で検索を終了するため、大きな配列でも効率的に動作します。また、どの要素も条件を満たさなかった場合は undefined を返すという点も重要な特徴です。 find()メソッドの基本構文 arr.find(callback(element[, index[, array]])[, thisArg]) callback:各要素に対して実行されるテスト関数。true を返した要素が結果となります。 thisArg(省略可):callb