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

JavaScriptで配列内の要素からランダムなインデックスを取得する方法

問題

JavaScriptで関数を作成します。この関数は、重複を含む可能性のある数値の配列 arr を第1引数として受け取り、その配列内に必ず存在する整数を第2引数として受け取ります。

関数は、指定された数値が配列内に存在するインデックスを返す必要があります。ただし、その数値が配列内に複数回出現することもあるため、該当するすべてのインデックスの中から1つをランダムに選んで返す必要があります。

例えば、関数への入力が以下のようになっているとします。

const arr = [5, 3, 6, 7, 3, 4, 2, 3];
const num = 3;

この場合の出力は次のようになります。

const output = 4;

出力の説明

数値 3 は、この配列ではインデックス 147 の位置に存在します。インデックスはランダムに選択されるため、出力はこれらのいずれかの値になります(上記の例では 4 が出力されています)。

サンプルコード

この処理を実装したコードは以下のとおりです。

const arr = [5, 3, 6, 7, 3, 4, 2, 3];
const num = 3;

Array.prototype.pick = function(target) {
    const targets = [];
    this.findTarget(0, this.length, target, targets);
    return targets[Math.floor(Math.random() * targets.length)];
};

Array.prototype.findTarget = function(start, end, target, targets) {
    if(start + 1 === end || start === end) {
        if(this[start] === target) targets.push(start);
        return;
    }
    let j = start + Math.floor((end - start)/2);
    this.findTarget(start, j, target, targets);
    this.findTarget(j, end, target, targets);
};

console.log(arr.pick(num));

コードの解説

このコードの仕組みは次のとおりです。

  • findTarget メソッドは、配列を半分ずつに分割しながら再帰的に探索を行う「分割統治法」を採用しています。
  • 探索の過程で、対象の数値と一致する要素のインデックスをすべて targets 配列に収集します。
  • pick メソッドは、収集したインデックスの中から Math.random()Math.floor() を使って1つをランダムに選び、それを返します。

よりシンプルな実装方法

再帰を使わず、forEach を使えば同じ処理をより簡潔に書くこともできます。

const arr = [5, 3, 6, 7, 3, 4, 2, 3];
const num = 3;

const pickRandomIndex = (arr, target) => {
    const indexes = [];
    arr.forEach((value, i) => {
        if (value === target) indexes.push(i);
    });
    return indexes[Math.floor(Math.random() * indexes.length)];
};

console.log(pickRandomIndex(arr, num));

こちらの方法では、まず対象の数値と一致するすべてのインデックスを配列に集め、その中からランダムに1つ選んで返します。コードが直感的で読みやすいため、実務ではこちらのアプローチが推奨されます。

出力結果

コンソールには次のように出力されます(実行ごとに結果が変わる可能性があります)。

4
  1. JavaScriptのfindIndex()メソッドの使い方を徹底解説

    JavaScriptのfindIndex()メソッドは、配列の中から条件に合致する最初の要素を見つけ、そのインデックス(添字)を返すためのメソッドです。条件を満たす要素が存在しない場合は「-1」が返されます。配列の検索処理において、要素そのものではなく「位置」を知りたい場合に非常に便利なメソッドです。findIndex()の基本構文array.findIndex(function(currentValue, index, arr), thisValue)各引数の意味は以下の通りです。currentValue:現在処理中の要素の値index:現在処理中の要素のインデックス(省略可能)arr:対象

  2. JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説

    Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g