2011-07-01 5 views
19

私はマップに適したコードを実装しています。JQueryのマップとJavaScriptのマップvsループの場合

var stuff = $.map(listOfMyObjects, someFunction()) 

var stuff = listOfMyObjects.map(someFunction()) 

か、単に

var stuff = new Array(); 
for(var i = 0; i < listOfmyObjects.length; i++){ 
    stuff.push(someFunction(listOfMyObjects[i])); 
} 
+0

あなたの例は同じではなく(最初のコードスニペットの意味もありません)。リスト内の各要素に対して 'someFunction'を実行することを意味しますか?それは値を返し、リスト項目を戻り値で置き換えたいのですか?それは実際に 'map'の考え方です。 –

答えて

11

後者(forループ)ははるかに高速です。私はどこかでベンチマークを見たのを覚えていますが、私はリンクを見つけることができません。

パフォーマンスが本当に問題であれば、私はforループを使用します。それはあまりコードをあいまいにしていません。

+8

forループはsomeFunctionをループにインライン化しない限り、おそらく同じパフォーマンスに近いでしょう。マップは本質的に1つの余分な関数呼び出しで同じことをやっているだけですが、パフォーマンスヒットは毎回関数を呼び出すことに由来し、各関数のスコープに値を設定します。 – Robert

+1

https://jsperf.com/map-vs-for-loop-performance/6 – ericn

6
:私の質問はこのアボ行くための最善の方法であるであるので、しかし、私は、私が反復処理するつもりだ、リスト内のオブジェクトを大量に持っています

まず、真Objectsにはネイティブ.map()メソッドがありません。.lengthプロパティもありません。つまり、ArraysまたはArray-like-objects(たとえばjQueryオブジェクト)について話しています。

しかし、ネイティブのfor,whileまたはdo-whileループを使用するよりも、高速に反復する方法はありません。他のすべての関数演算は、各反復のための関数を実行する(推定する)。

jQueryの.each()は、オブジェクトが渡されたときにループを実行します。for-inこれは、オブジェクトをループする方法としては、かなり早いです。自分でfor-inを使うだけで、オーバーヘッドコールを保存することができます。

読みやすさの点でもう1つ「良い」方法は、.keys().map()のようなES5機能を使用することです。たとえば:

var myObj = { 
    foo: 'bar', 
    base: 'ball', 
    answer: 42, 
    illuminati: 23 
}; 

Object.keys(myObj).map(function(prop) { 
    console.log(myObj[ prop ]); 
}); 

私は、読みやすさ、納得感、パフォーマンスの面で非常に優れていると思います。もちろん、古いブラウザにはES5抽象ライブラリを使用するべきです。

しかし、ここでも、パフォーマンスの面でネイティブループを克服する方法はありません。

+0

申し訳ありませんが、私は誤って話しました。私はリスト内のオブジェクトを言うつもりだった。私の質問を編集してもっと理にかなっています。 – dave

1

html/javascriptコードを使用してテストケースを作成します(jsperf)。

どのブラウザが最適なのか、どのブラウザがどのくらい高速にループを実行するかを確認できます。

私はネイティブのJavaScriptループにお金を入れますが、あなたは決して知らないでしょう。

2

+1「Emilによるテスト」回答:これは常に正しい答えです。

しかし、ネイティブループが勝つので、.length参照が各反復で評価されないように、長さをキャッシュすることでより良い結果を得ることができます。

for(var i = 0, l = list.length; i < l; i++) 

またはあなたがより速く、まだだろう「インライン」「someFunction」、可能であれば、後方

for(var i = list.length-1; i >= 0; i--) 

それをやってことで、余分なVARを避けます。基本的には、できるだけ関数呼び出しや参照を避けてください。しかし、それはあなたが本当に細部を見ている場合のみです。このような最適化はほとんど問題にならないだろう。常にボトルネックを見つけるためにテストしてください。ここで

+3

for(var i = array.length; i - ;) 'は逆ループのためのより良いオプションです。 – sabithpocker

11

はjsben.chで行われたテストケースである:http://jsben.ch/#/BQhED

それはforループマップ(少なくともクロムで)jQueryのマップよりも速いことを示しています。

+1

質問に記載されている3番目のケースも追加しましたが、forループアプローチの推奨事項は、私のためにも最初にランク付けされています(クロム)。 –

+0

d3.jsとunderscore.jsのマップメソッドがこれらとどのように比較されているのか興味深いでしょう。 – amergin

関連する問題