1

非常に大きなオブジェクトがあり、その値を反復処理するだけです。

以下のようなループを書くと、キーが1mのオブジェクトの場合、ハッシュ関数とハッシュルックアップが1m回呼び出されます。パフォーマンス上の理由から、これは避けたいと思います。

for (var key in myObj) {sum+=myObj[key]}

どういうわけか、キーを気にせずに値のみを反復処理できますか?

4

4 に答える 4

3

ここに誤解があるかもしれません。

Javascriptオブジェクトは単純な配列ではなく、その特定の内部実装はJavascriptコードから隠されていることをおそらくご存知でしょう。オブジェクトはKey-Valueコレクションであり、順序が保証されていないと思います。

for(myObjのvar key)を使用すると、ハッシュキールックアップが行われることをどのように知っていますか?

実際、それを行うには、ハッシュを計算するためのキーの知識が必要になるという保証はないと思います。ただし、キーを指定せずにすべての値を要求しています。

for(myObjのvar key)が、(使用するブラウザーまたはjsエンジンに応じて)必要なものに最も近い利用可能なことをすでに実行しているという合理的な可能性があります。すべてのキーが必要なため、内部構造を直接スキャンしてハッシュの計算を回避する可能性が高いと思われます。

jsの実装についてより専門家であり、標準ではこれについてさらに多くのことを提供できるかもしれません。

于 2012-04-30T06:43:47.790 に答える
2

この種の音については、キー用と値用の 2 つの異なる配列を保持することをお勧めします。

すなわち

keys[0]="user"
values[0]={name:"aaa",email:".......
keys[1].....

したがって、両方を非常に迅速に反復できます

于 2012-04-30T06:39:19.957 に答える
1

いいえ。標準の JavaScript インタープリターでは、名前のないプロパティの値を取得する方法はありません。

于 2012-04-30T06:37:19.243 に答える
0

いいえ、ここでキーを使用してループを回避する方法はありません。ちなみに、質問で説明する内容は、数値のみの配列のように見えます。オブジェクトでよろしいですか?次に、私が行う最初の最適化は、配列を使用して合計を計算することです。その後、世界はあなたの足元にあります。配列をループする方法はたくさんあります。

エクストラリンク
エクストラリンク2

それが本当にパフォーマンスの問題である場合は、@ DuffsDeviceをご覧ください

于 2012-04-30T06:57:52.597 に答える