6

Javascriptでコレクションのメンバーシップチェックを効率的に行うにはどうすればよいですか?文字列の配列が大きい可能性があるため、特定の文字列が配列のメンバーであるかどうかを確認する必要があります。

当初、私はオペレーターが助けてくれると思っていましたinが、Mozilla Developer Networkのドキュメントを読んだ後、その目的が異なることに気づきました。Javascriptでは、指定されたプロパティが指定されたオブジェクトにあるかどうかをチェックします。

パフォーマンスに関連する理由から、私はjsビルトインを使用したいのですが、そのような関数が存在しない場合は、おそらく次のいずれかを実行することになります。

  1. 配列を使用して、配列要素をキーとして持つオブジェクトを作成してから、in
  2. 配列要素を反復処理し、項目ごとに比較を行います
  3. 二分探索を実装する

何か意見はありますか?またはより良いアイデア?

ありがとう

4

4 に答える 4

2

この質問でわかるように、ほとんどすべてのフレームワークにそのための関数があり、一部のブラウザーはindexOf関数をネイティブに実装しています(ただし、すべてではありません)。

それらはすべて配列を反復することによってそれを行うようですが、より高速であるように見えるため、他の方向(最後から開始)を使用するものもあります。劣線形アルゴリズムの場合、キーの二分探索を使用して、ある種のハッシュセットを実装する必要があります。

HashSetの実装の例は、ここにあります。

于 2011-03-08T11:39:27.887 に答える
2

これは十分なパフォーマンスを持っていますか?

var inArray = function(array, value) {
    var i = array.length;

    while (i--) {
        if (array[i] == value) {
            return true;
        }
    }

    return false;

}

jsFiddle

アプリケーションで必要な場合を除いて(これがボトルネックであるかどうかを測定して確認してください)、これは十分に高速で、読み取るのに十分簡単である必要があります。

于 2011-03-08T11:43:48.583 に答える
0

配列を使用する必要がありますか?最初からオブジェクトを使用できますか?要素を反復処理する必要がある場合は、オブジェクトでforinループを使用できます。

二分探索は、ソートされている場合にのみ機能します。配列を何度も検索することがわかっている場合は、これは良い考えかもしれません。それ以外の場合は、オプション2の方が高速です。

于 2011-03-08T11:40:06.340 に答える
0

オブジェクトと配列の両方を使用することをお勧めします。

このようにして、オブジェクトのメンバーシップテストを非常に迅速に実行し、アイテムを並べ替えたままにする必要がある場合に配列を使用できます。

これは、「ソートされた辞書」タイプの動作をエミュレートするために私が見つけた唯一の方法です。

于 2011-03-08T11:44:50.723 に答える