2012-02-18 27 views

答えて

6

をはい、配列の反復機能を使用して完全に罰金だと私は個人的にいつでも私ができるの代わりに、ループのためにそれらを使用するようにしてください。私はそうする主な理由は以下のとおりです。

  • その乱雑コード(ループカウンタなど)役に立たない変数を宣言し、私の​​JSHintを混同する必要はありません。

  • 私はアレイを一度だけ書き留める必要があります。これにより、配列変数の名前を変更するのが容易になります。また、式を直接渡す方が便利です(配列を別の変数に保存する代わりに)

  • 通常のforループはクロージャ-insides-for-loopsのバグです。

そのmapforEachと友人が古いブラウザ(特に、Internet Explorerなど)に存在しないので、あなたが(ネイティブ配列にこれらのメソッドを追加するために)シムを使用するか、またはから同様の機能を使用する必要がありますいずれかを忘れないでくださいカスタムライブラリ。

編集:現在、これらの機能を自由に使用することができます。 IE8をサポートする必要がある場合は、これよりも大きな問題があります。

+1

補遺: 'map'は、返された値の配列を返すので、反復のタスクのための過剰です。また、 'map'(または' forEach')でループを壊すことはできません。一般的なfor-loopを置き換えるものは['every'](https://developer.mozilla.org/ja/JavaScript/Reference/Global_Objects/Array/every)です。これは、ループ内で' false'を返すとループを壊します。イテレータ。 – katspaugh

+1

@katspaugh:もしあなたがこの方向を見ることを望んでいれば、さらに悪い。通常のforループは、制御フローに 'break'、' continue'、 'return'を自由に使用することができます。また、複数のレベルをリワインドすることもできます(リターンまたはラベル付きブレーク付き)。つまり、単純なforeachを必要とし、その場合ループを壊すことができない大部分の時間は、機能と見なされるかもしれません。そして、私たちはレキシカルスコープを持たない 'this'で始めることをお勧めします。 – hugomg

3

が、これは全く悪い考えではありませんが、標準パターンが.each()を使用することです:

var $l = $(selector); 
$l.each(function(){ $(this).css({foo:bar}) }); 

主な相違点は、.map()は修正されたオブジェクトの配列を返すことを意図していますが、.each()はそれぞれのオブジェクトに対して関数を実行するだけなので、概念的にあなたがしようとしているものに近いです。 return配列を作成します)。

これは、「jQueryオブジェクトの配列」が実際はjQueryオブジェクト自体であることを前提としています(これは標準的なアプローチです)。そうでない場合は、代わりに.forEach()を使用できます。これは標準のArrayメソッドです。

あなただけの配列について、一般的に話をしている場合は、考慮すべきポイントのカップルがあります:他の人が指摘している

  • として、古いブラウザではネイティブに.map().forEach()をサポートしていないので、あなたがしたいですこれらの環境をサポートするためには、何らかのシムやポリフィルが必要です。 .map().forEach()、しかし、私はより頻繁にforループよりもそれらを使用する理由の1程度

  • 一つの良いところは、彼らはあなたのループ内に新しい関数スコープを与えるということです。これは、現在の項目を参照するループ内にクロージャを作成できることを意味します。これは、ループ全体がforループの場合に発生します。たとえば、次のように

    list.forEach(function($item) { 
        $item.click(function() { 
         alert("This is item " + $item.data('name')) 
        }) 
    }); 
    

    (。あなたは$(this)を使用することができますので、これは、jQueryを使って赤いニシンのビットですが、それは非常に便利だ場所がたくさんある)

  • .map().forEach()ことができますを使用してあなたが好きならば、あなたは可能性が、forループではあまりエレガントだ方法で、機能を再利用します

    function foo($item) { $item.css({foo:"bar"}) } 
    list.forEach(foo); 
    anotherList.forEach(foo); 
    
  • これは単なる個人的な好みですが、私はフィン構文とスタイルは一般的にforループよりもエレガントであり、現在のスコープにxのような反復変数を置かないようにします。

  • ネストされた構造を扱うときは、.map().forEach()を使用すればわかりやすい名前になります。たとえば:あなたはシムを使用せずに、古いブラウザをサポートしたい場合、それは悪いです

    alert(cities[x] + ', ' + cities[x][y] + ', ' + cities[x][y][z]); 
    
+0

word。もっと一般的な質問でした。D – samccone

+0

より一般的な回答をご覧ください。 :) – nrabinowitz

+0

私はこの答えがとても好きです:) – samccone

3

states.forEach(function(state) { 
    state.forEach(function(county) { 
     county.forEach(function(city) { 
      alert(city + ', ' + county + ', ' + state); 
     }) 
    }); 
}); 

は、あなたの内alert文は次のようになります入れ子にforループと比較しますアイディア。

古いブラウザやシムを読み込んでサポートしても問題ない場合は、問題ありません。

一方、someは、シムを使用することは悪い考えであると主張しています。その場合、古いブラウザをサポートする必要がある場合、mapは悪い考えです。個人的に、私はシムの問題についてまだフェンスにいます。

また、これが適切かどうかはわかりませんが、mapは配列をフラット化することに注意してください。これはmapの機能ではないため、実装が壊れていると考えている人もいます。


ちょうど楽しみのために、繰り返しの機能についてはmissingno's argumentsの反論があります。

(ループカウンタなど)役に立たない変数を宣言する必要はありません

ループは常にカウンターを持っている必要はありません。あなたは、オブジェクトの使い捨ての配列を扱う場合には、例えば、うまくこの作品のようなループ:ループの正規で

var things = [{foo:1}, {bar:2}, {foo:3}, {bar:4}], item; 
while (item = things.shift()) { 
    console.log(item); 
} 

私は場合は、配列名を複数回(そうその多くの作業を入力する必要がI名前を変更したい)

上記の例では、宣言された後に一度だけ配列名を入力する必要がありました。私たちのループのためのカウンタが必要な非使い捨て配列であっても、配列の名前を余分に入力する必要はありません。

通常のforループは、closures-inside-for-loopsのバグに対して脆弱です。

は、うん、あなたはそこに私を得た:)

関連する問題