特定の数値を文字列値にマップする必要があります。これらの数字は必ずしも連続しているとは限らないため、たとえば次のようなものがあります。
var obj = {};
obj[10] = "string1";
obj[126] = "string2";
obj[500] = "string3";
このような検索を行う場合obj[126]
、オブジェクト{}
または配列を使用する方が高速でしょう[]
か?
特定の数値を文字列値にマップする必要があります。これらの数字は必ずしも連続しているとは限らないため、たとえば次のようなものがあります。
var obj = {};
obj[10] = "string1";
obj[126] = "string2";
obj[500] = "string3";
このような検索を行う場合obj[126]
、オブジェクト{}
または配列を使用する方が高速でしょう[]
か?
私は作成しましたマイクロベンチマークあなたのために- @Bergiによるより包括的なテストをチェックしてください。私のブラウザでは、オブジェクトリテラルは少し遅くなりますが、それほど大きくはありません。自分で試してみてください。
違いはありません。ECMAScript 配列は、スパース (つまり、連続するインデックスが設定されていない) の場合、ハッシュ テーブルとして実装されます。いずれにせよ、O(n) アクセス時間が保証されているので、これはまったく気にする必要はありません。
JS配列はオブジェクトであるため、何を選択してもかまいません。
これを実証するために、jsperfテスト(http://jsperf.com/array-is-object)を作成しました。
間違いなくオブジェクトが最良の選択です。
そのようなコードがある場合:
var arr = [];
arr[10] = 'my value';
、配列は11個の値の配列になります
alert(arr.length); // will show you 11
、ここで最初の 10 はundefined
です。
明らかに、格納するために長さ1000の配列は必要ありません
var arr = [];
arr[999] = 'the string';
また、プログラミングでは、特定のケースに適したクラスを選択する必要があることに注意する必要があります。
あなたの仕事はペアのマップを作成することであり、オブジェクトはここでより良い選択です.
あなたのタスクが順序付けられたコレクションを作成することであった場合、配列が必要であることを確認してください。key: value
アップデート:
コメントで質問に答えます。
配列とオブジェクトの 2 つの「コレクション」があるとします。それらのそれぞれには、999 に等しいキー/インデックスが 1 つだけあります。
値を見つける必要がある場合は、コレクションを反復処理する必要があります。
配列の場合、999 回の反復があります。
オブジェクトの場合 - 反復は 1 回のみです。
http://jsfiddle.net/f0t0n/PPnKL/
var arrayCollection = [],
objectCollection = {};
arrayCollection[999] = 1;
objectCollection[999] = 1;
var i = 0,
l = arrayCollection.length;
for(; i < l; i++) {
if(arrayCollection[i] == 1) {
alert('Count of iterations for array: ' + i); // displays 999
}
}
i = 0;
for(var prop in objectCollection) {
i++;
if(objectCollection[prop] == 1) {
alert('Count of iterations for object: ' + i); // displays 1
}
}
ベンチマーク </p>
合計で:
アプリケーションを適切に設計し、コレクションでいくつかの異なる操作が必要になる可能性のある将来のタスクを考慮に入れる必要があります。
コレクションを注文する必要がある場合は、array
.
それ以外の場合、object
プロパティへのアクセス速度は配列のアイテムへのアクセス速度とほぼ同じですが、値の検索はobject
sparse よりも高速になるため、より良い選択になる可能性がありますarray
。