2012-05-24 8 views
11
私はJavascriptで読む

:JavaScriptの配列のが本当にオブジェクトであるので、良いパーツ...JQueryとUnderscore "each"は配列の順序を保証しますか?

は、for in文は、配列のすべてのプロパティを反復処理するために使用することができます。残念ながら、内のプロパティの順序についての保証を行いません...

ときに私の知る限り、「各」機能がfor inに基づいています知っているように、その後、each関数形式jQueryとアンダースコアライブラリは、順序を保証しません配列を反復処理しますか?私は迷惑な標準forを避けようとしています。

ありがとうございます。

+1

配列が何であるか、オブジェクトがJavaScriptに何であるかを明確にしてください... – Pointy

答えて

16

配列を反復処理する場合、常に順序が保証されます。それは(配列ではない)オブジェクトを反復処理するときです。保証がない場合です。配列はまだオブジェクトです。


eachは、アレイ等のオブジェクトのfor in、及びfor以下です。フレームワークはジョブの正しいループを決定し、同じロジックが適用されます。オブジェクトの反復は整然としていますが、配列の反復は順調です。

アンダーのソース:

var each = _.each = _.forEach = function (obj, iterator, context) { 
     if (obj == null) return; 
     if (nativeForEach && obj.forEach === nativeForEach) { 
      obj.forEach(iterator, context); 
     } else if (obj.length === +obj.length) { 
      for (var i = 0, l = obj.length; i < l; i++) { 
       if (i in obj && iterator.call(context, obj[i], i, obj) === breaker) return; 
      } 
     } else { 
      for (var key in obj) { 
       if (_.has(obj, key)) { 
        if (iterator.call(context, obj[key], key, obj) === breaker) return; 
       } 
      } 
     } 
    }; 

jQueryのソース:インデックス付き要素のアレイの超える数値ループ、またはA:

each: function (object, callback, args) { 
    var name, i = 0, 
     length = object.length, 
     isObj = length === undefined || jQuery.isFunction(object); 
    if (args) { 
     if (isObj) { 
      for (name in object) { 
       if (callback.apply(object[name], args) === false) { 
        break; 
       } 
      } 
     } else { 
      for (; i < length;) { 
       if (callback.apply(object[i++], args) === false) { 
        break; 
       } 
      } 
     } 
     // A special, fast, case for the most common use of each 
    } else { 
     if (isObj) { 
      for (name in object) { 
       if (callback.call(object[name], name, object[name]) === false) { 
        break; 
       } 
      } 
     } else { 
      for (; i < length;) { 
       if (callback.call(object[i], i, object[i++]) === false) { 
        break; 
       } 
      } 
     } 
    } 
    return object; 
} 
+0

私はそれがはっきりしていないと思ったので、私は質問を編集しました。私はオブジェクト/配列の問題よりも多くの機能を心配しています。 – davidgnin

+0

@davidgninそれぞれは、forループとforループよりも何もありません。同じロジックが適用されます。 – Joseph

+0

ありがとうございました!それから、アレイはそれぞれのためにではなく、それは私が知りたいと思っていたものです。 – davidgnin

3

あなたは、配列をループすることができ、2つの方法がありますfor inのオブジェクトプロパティの配列をループします。

var a = ['a','b']; 
a[3] = 'e'; 
a[2] = 'd'; 
a.foo = function() { }; 
for(key in a) 
    console.log(key); 

そのプロパティが定義された順序であるので、これは、0 1 3 2 fooを返します(ただし、お使いのブラウザでもどちらか、その挙動を示す必要がある何の約束はありません)。

これまでの数値ループは優れていますが、スペアアレイ、つまりギャップのある配列は処理できません。 ES5 Array.forEachは不特定の値を省略し、一方、jQueryの$.eachlengthプロパティに基づく数値ループを使用します。

var a = [1,2]; 
a[1000000] = 4; 
a[9000] = 3; 
a.foo = function() {}; 

// outputs 0, 1, 9000, 1000000 -- note they are in order 
a.forEach(function(elem, index){ console.log(index); }) 

// outputs 0, 1, 9000, 1000000 -- same as above 
_.each(a, function(elem, index){ console.log(index); }) 

// outputs a million values and locks up your browser for a while 
$.each(a, function(index){ console.log(index); }) 

ので、両方forEachとは$.eachインデックス順に値を返しますが、彼らはそれらに割り当てられた値を持っていなかったインデックスを無視するのでforEachとアンダースコアは、スパース配列のための優れたようです。

関連する問題