2014-12-22 7 views
5

Ho una matrice sparsa il cui contenuto non è garantito per essere inserito nell'ordine di indice ma deve essere iterato nell'ordine di indice. Per scorrere attraverso una matrice sparsa, capisco che è necessario utilizzare una dichiarazione for..in.Come dovrei scorrere su un array sparse nell'ordine dell'indice?

Tuttavia, secondo this article:

Non v'è alcuna garanzia che per il ... in restituirà gli indici in alcun ordine particolare

Ma stackoverflow questions like this suggeriscono che, mentre gli ordini oggetto di proprietà non sono garantito, gli ordini di matrice sono:

proprietà di ordine in oggetti non sono garantiti in JavaScript, è necessario utilizzare un Arra y.

I tested this nelle ultime versioni di Chrome, Firefox e 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>"); 
} 

Tutti sembrano onorare l'ordine dell'indice in modo da poter sempre fido di questo sia il caso? Altrimenti, come posso ottenerli meglio nell'ordine dell'indice?

+0

non vorrei prendere quella linea è stata citata come un'indicazione che l'ordine 'for..in' è garantito con gli array. (Non sto dicendo che non lo è, ma quella linea in realtà non sta dicendo che lo sia). Inoltre, ci sono [ottime ragioni] (http://stackoverflow.com/questions/500504/why-is-using-for-in-with-array-iteration-such-a-bad-idea) per evitare l'uso ' for..in' con gli array, anche se l'ordine funziona ok. – JLRishe

+0

Puoi vedere le differenze qui: http://jsfiddle.net/abhitalks/rfe33uxf/ – Abhitalks

+0

c.f. [questa risposta] (http://stackoverflow.com/a/4261096/1945651): _ "Inoltre, l'ordine di iterazione non è garantito dalla specifica. Ciò significa che se si desidera" iterare "un oggetto array, con questa affermazione non può essere certa che le proprietà (indici di array) saranno visitate nell'ordine numerico. "_ – JLRishe

risposta

10

MDN ha la risposta alla tua domanda iniziale:

Nota: for..in non deve essere utilizzato per iterare su un array in cui l'ordine dell'indice è importante.

Gli indici di array sono solo proprietà enumerabili con nomi interi e sono altrimenti identici alle proprietà generali dell'oggetto. Non vi è alcuna garanzia che per ... in restituirà gli indici in un ordine particolare e restituirà tutte le proprietà enumerabili, comprese quelle con nomi non interi e quelli ereditati.

Non è necessario utilizzare for..in per scorrere un array sparso, e si dovrebbe definitely avoid doing so se potete.

Si può semplicemente utilizzare .forEach:

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

forEachis defined iterare in ordine di indice e includere solo elementi presenti nella matrice:

forEach esegue la richiamata forniti una volta per ogni elemento presente nell'array in ordine crescente. Non è invocato per gli indici che sono stati cancellati o eliminati. Tuttavia, viene eseguito per elementi presenti e con valore non definito.


Se sei targeting ambienti che non supportano forEach, è possibile utilizzare il seguente, o lo spessore fornito su quella pagina MDN:

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

Grazie. E [questo post] (http://stackoverflow.com/questions/13600922/does-javascript-array-foreach-traverse-elements-in-ascending-order) mi dice che ForEach è garantito. –