1

非常に大きなハードコードされたインデックス配列を連想配列に簡単に変換したいので、ルックアップがはるかに高速になります。

var arr = ["a", "b", "c"];

現在、arr をループして、その値を値と比較して、一致するかどうかを確認しています。何百もの要素があるので、かなり遅くなり、連想配列を使用する方が高速になります。

しかできないらしい

var arr = {"a", "b", "c"}; 

遅すぎるため、実際に値を追加することはできません。

確かに、要素を関連配列にコピーしたり、配列を並べ替えたり、バイナリ検索を実行したりできますが、配列要素にデフォルト値を割り当てて上記の構文を使用する方がはるかに簡単です。

私はこれが不可能だと思いますか?

4

4 に答える 4

1
var mapLookup = arr.reduce(function (accumalator, value) {
    accumalator[value] = true;
    return accumalator;
}, {});
于 2013-02-17T05:03:28.213 に答える
1

そうでない理由: var arr = {"a":1, "b":1, "c":1};

于 2013-02-17T05:03:50.293 に答える
1

最新のブラウザのほとんどはArray.indexOf(). -1検索結果がない場合に返されます。

実際に速度の問題がありますか、それとも事前に最適化しているだけですか? 使用するコンテナは配列です。要素の配列があります。それらは他の値と関連付けられていません。なぜそれらをマップ コンテナーに入れるのでしょうか?

また、独自の要素セットをset持つ が必要なようです。

于 2013-02-17T05:05:51.823 に答える
1

配列を連想配列に変換するのは、最も簡単で非常に高速なようです。

var arr = ["a", "b", "c"];
var arrA = {}; for(var i = 0; i < arr.length; i++) arrA[arr[i]] = 0;

次にkey in arrA、O(1) ルックアップに使用します。(キーに値を明示的に指定する必要がないようにする方が簡単ですが....)

本質的に

if (key in arrA) ...

置き換えます

for(var i = 0; i < arr.length; i++) if (key == arr[i]) ...

ループ内で使用する場合、これは本質的に O(n) 対 O(n^2) です。

于 2013-02-17T05:11:53.513 に答える