2014-12-22 8 views
5

Ich habe ein Sparse-Array, dessen Inhalt nicht garantiert in die Indexreihenfolge eingefügt wird, sondern in der Indexreihenfolge durchlaufen werden muss. Um ein Sparse-Array zu durchlaufen, verstehe ich, dass Sie eine for..in-Anweisung verwenden müssen.Wie soll ich ein Sparse-Array in Indexreihenfolge durchlaufen?

Doch nach this article:

Es gibt keine Garantie dafür, dass für ... in werden die Indizes in einer bestimmten Reihenfolge

Aber stackoverflow questions like this legen nahe, dass während Objekteigenschaft eine Rückkehr nicht garantiert, Array-Bestellungen sind:

Eigenschaften Reihenfolge in Objekten sind nicht garantiert in JavaScript, müssen Sie ein Arra verwenden y.

I tested this in den neuesten Versionen von Chrome, Firefox und IE.

<ol id="items"></ol> 
var list = []; 

function addItem(index) { 
    list[index] = { idx : index }; 
} 

var insertOrder = [ 8, 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15 ]; 

for (var i = 0; i < 15; i++) { 
    addItem(insertOrder[i]); 
} 

for(var item in list) { 
    $("#items").append("<li>" + list[item].idx + "</li>"); 
} 

erscheinen alle so den Index, um zu ehren kann ich vertrauen, dies immer der Fall zu sein? Ansonsten, wie bekomme ich sie am besten in Indexreihenfolge?

+0

würde ich nicht nehmen Diese Zeile, die Sie angegeben haben, ist ein Hinweis darauf, dass 'for..in' mit Arrays garantiert ist. (Ich sage nicht, dass es nicht ist, aber diese Zeile sagt nicht wirklich, dass es ist). Außerdem gibt es [sehr gute Gründe] (http://stackoverflow.com/questions/500504/why-isusing-for-in-in-array-iteration-such-a-bad-idea), um die Verwendung von 'zu vermeiden for..in' mit Arrays, auch wenn die Reihenfolge ok ist. – JLRishe

+0

Sie können die Unterschiede hier sehen: http://jsfiddle.net/abhitalks/rfe33uxf/ – Abhitalks

+0

c.f. [diese Antwort] (http://stackoverflow.com/a/4261096/1945651): _ "Auch die Reihenfolge der Iteration ist nicht durch die Spezifikation garantiert, was bedeutet, dass, wenn Sie ein Array-Objekt mit" iterieren "möchten Mit dieser Anweisung können Sie nicht sicher sein, dass die Eigenschaften (Array-Indizes) in der numerischen Reihenfolge aufgerufen werden. "_ – JLRishe

Antwort

10

MDN hat die Antwort auf Ihre ursprüngliche Frage:

Hinweis: for..in sollte nicht ein Array iterieren verwendet werden, wobei der Index um wichtig ist.

Array-Indizes sind nur aufzählbare Eigenschaften mit Ganzzahlnamen und sind ansonsten identisch mit allgemeinen Objekteigenschaften. Es gibt keine Garantie, dass für ... in die Indizes in einer bestimmten Reihenfolge zurückgibt und alle aufzählbaren Eigenschaften zurückgegeben werden, einschließlich solcher mit nicht ganzzahligen Namen und denen, die vererbt werden.

Sie müssen for..in nicht verwenden, um durch eine spärliche Array zu durchlaufen, und Sie sollten definitely avoid doing so wenn Sie können.

Sie können einfach .forEach verwenden:

list.forEach(function (el) { // add a second parameter if you need the indices 
    $("#items").append($("<li>").text(el.idx)); 
}); 

forEachis defined in Indexreihenfolge durchlaufen und nur Elemente enthalten, die in der Anordnung vorhanden sind:

forEach führt die vorgesehenen Rückruf einmal für jedes Element im Array in aufsteigender Reihenfolge vorhanden. Es wird nicht für Indizes aufgerufen, die gelöscht oder gelöscht wurden. Es wird jedoch für Elemente ausgeführt, die vorhanden sind und den Wert nicht definiert haben.


Wenn Sie Umgebungen Targeting sind, die nicht forEach unterstützen, können Sie die folgende oder die Shim auf dieser Seite MDN vorgesehen verwenden:

for (var i = 0; i < list.length; i += 1) { 
    if (i in list) { 
     $("#items").append($("<li>").text(list[i].idx)); 
    } 
} 
+0

Danke. Und [dieser Beitrag] (http://stackoverflow.com/questions/13600922/does-javascript-array-foreach-traverse-elements-in-ascending-order) sagt mir, dass ForEach garantiert ist. –