0

私のアプリケーションでは、キーによる高速反復と高速ルックアップを実行できるコレクションが必要です。

サンプルデータ

var data = [
   { myId: 4324, val: "foo"},
   { myId: 6280, val: "bar"},
   { myId: 7569, val: "baz"},
   ... x 100,000
];

キーは、保存したいオブジェクトに含まれています。Harray(Hash Array)https://gist.github.com/3451147を一緒にハックしました。

使い方は次のとおりです

// initialize with the key property name
var coll = new Harray("myId");
// populate with data
data.forEach(function(item){ coll.add(item); });
// key lookup
coll.h[4324] // => { myId: 4324, val: "foo"}
// array functionality
coll[1] // => { myId: 6280, val: "bar"}
coll.map(function(item){ return item.val; }); // => ["foo", "bar", "baz"]
coll.length // => 3
// remove value
coll.remove(coll[0]); // delete => { myId: 4324, val: "foo"}
// by key
coll.removeKey(7569) // delete => { myId: 7569, val: "baz"}
// by index
coll.removeAt(0); // delete => { myId: 6280, val: "bar"}

除去速度は私が見ることができる唯一のトレードオフのようです。保存されたオブジェクトはとの間で共有されるためh ObjectArray2つのコピーは保存しません。

質問

  1. for inオブジェクトのプロパティを反復処理するために使用することに固執する必要がありますか?
  2. オブジェクト自体ではなく、オブジェクトのキーの配列を保持しますか?
  3. 別のオプション?

注:ブラウザーの互換性は要因ではありません。これはクローム専用です。

4

1 に答える 1

1

特定のコレクションが役立つかどうかを知るには、次のことを行う必要があります。

  • まず、パフォーマンスの問題があることを確認します。十分に速い場合は、心配しないでください。これを確認するには、ページ全体が遅いと仮定して、Chromeプロファイラーなどのプロファイラーを使用して、現在使用しているコレクションに問題があることを確認します

  • 次に、構築している代替コレクションが本当に高速であることを確認します。これを行うための一般的な解決策は、 http://jsperf.com/などのサイトを使用して(または単に独自の時間指定テストを作成することによって)十分な大きさのデータセットを使用して両方のソリューションをベンチマークすることです。

その後になって初めて、ソリューションがAPIで完全であり、完全にバグがないこと(テストユニットを使用)などを確認する必要があります。

最初に述べた2つのチェックを実行すると、V8エンジンの標準オブジェクトが驚くほど高速でスマートになるため、無駄な作業を防ぐことができます。

于 2012-08-24T15:10:42.423 に答える