2015-11-05 2 views
15

Dato un ciclo for of il valore della variabile assegnata (i per questo esempio) è uguale a ciò che array[i] equivarrebbe se fosse un ciclo normale. Come si può accedere all'indice dell'array a cui è attualmente collegato i.Come si può accedere al numero corrente di I in un ciclo for?

Quello che voglio

let array = ["one", "two", "three"]; 

for (let i of array) { 
    console.log(i);// normally logs cycle one : "one", cycle two : "two", cycle three : "three". 
    console.log(/*what equals the current index*/);// what I want to log cycle one : 1, cycle two : 2, cycle three : 3. 
} 
+0

non so molto su javascript, ma in altre lingue, dovresti eseguire il looping sulla lunghezza dell'array, quindi sull'array stesso. –

+1

'let array = [" one "," two "," three "]; let index = 0; per (let i of array) { console.log (i); console.log (index ++) } ' – Kaiido

risposta

14

niente semplice ... se vuoi "semplice accesso" sia la voce e l'indice in un ciclo su un array, utilizzare forEach esempio

array.forEach(function(item, index) { 
... 
}); 

o come T.J. Crowder puntatore fuori (e ho perso il tag ES6)

array.forEach((item, index) => { 
    ... 
}); 

come molti linguaggi di programmazione, JavaScript ha più modi per fare cose simili, l'abilità è nella scelta del giusto strumento per il lavoro

+0

Questa sembra essere la soluzione migliore per il problema descritto. – nils

+3

In ES6, in realtà non esiste più alcun motivo per usare 'forEach'. – Bergi

+0

Sono incuriosito - cosa useresti invece ... hmmm ... ho appena visto 'for/of' con la risposta' .entries' ... –

5

Vuoi dire che questo ?

array = ["one", "two", "three"]; 

for (i = 0; i < array.length; i++) { 
    console.log(i); // Logs the current index number; 
    console.log(array[i]); // Logs the index matching in the array; 
} 

Anche una buona comment da Kaiido è che è possibile utilizzare questo per ottenere il valore dalla matrice direttamente come una variabile.

for (var ind = 0, i=array[ind]; ind < array.length; i=array[++ind]) { 
    console.log(i); 
    console.log(ind); 
} 
+0

Sì ma voglio avere un facile accesso all'idem nell'array con solo 'i' senza dover usare' array [i] '. –

+0

@ user5448026, La tua domanda era difficile da capire: p, ma perché non usare 'array [i]'? C'è un problema con esso? – Thaillie

+1

Che cos'è _non_ facile per 'array [i]'? – Cerbrus

1

uso indexOf per ottenere l'indice torna

let array = ["one", "two", "three"]; 

for (let i of array) { 
    console.log(i); 
    console.log(array.indexOf(i)); 
} 

NOTA: funziona solo per un array con duplicati.

+0

per quanto riguarda 'let array = [" one "," two "," three "," one "];' – Kaiido

+0

Non funziona se il valore duplicato è – Tushar

+0

true, sebbene la domanda non menzioni i duplicati. aggiornato la mia risposta. – BenG

22

È possibile utilizzare la funzione entries. Esso restituirà una coppia indice/valore per ogni voce nella matrice come:

[0, "one"] 
[1, "two"] 
[2, "three"] 

Utilizzare questo in tandem con array destructuring per risolvere ogni voce al nome variabile appropriata:

const arr = ["one", "two", "three"] 
for(const [index, value] of arr.entries()) { 
    console.log(index, value); 
} 

Babel REPL Example

+0

Mi piace la risposta, ed è tecnicamente corretto, ma sembrerebbe più intuitivo per me usare 'index' invece di' key'. –

+1

@AndrewWillems Punto interessante, in realtà avevo assunto (erroneamente) che 'entries()' avrebbe anche iterato qualsiasi proprietà impostata sull'array (cioè 'arr.one = "1" ') ma in realtà non è così, quindi hai ragione dovrebbe essere '[indice, valore]' – CodingIntrigue

+0

Per la cronaca, 'key' _is_ è tecnicamente corretto anche se è la sola/corretta parola chiave da usare per accedere solo a quei valori. per esempio. 'for (let i di arr.keys()) {console.log (i);}' produce "0, 1, 2". Ma, solo per rendere il punto di nuovo leggermente diverso, mentre gli array JavaScript _do_ hanno una forma di chiavi (con l'avvertenza che si fa notare) sono tasti numerici sequenziali e generalmente pensiamo a quelli come 'index'es (o indici, o qualunque cosa ortografia che vuoi). Quindi, per quanto riguarda la leggibilità del codice, penso che la tua ri-modifica della tua risposta all'uso di 'index' invece di' key' sia ancora la migliore. –

3

È possibile utilizzare la funzione entries() per ottenere un iteratore che include gli indici.

for (let [index, value] of [1, 2, 3].entries()) 
    console.log(index + ':' + value); 

o, se non vi piace la notazione let [,]:

for (let entry of [1, 2, 3].entries()) 
    console.log(entry[0]+ ':' + entry[1]); 

Ma per quanto riguarda gli altri array-calibro?Beh, si potrebbe facilmente solo prendersi cura di voi stessi, davvero

let index = 0; 
for (let ch of 'abcd') { 
    ++index; 
    //your code 
} 

Oppure, si può abbastanza facilmente patch in una propria implementazione

Object.defineProperty(String.prototype, 'indexerator', {get:function() { 
    var elements = this[Symbol.iterator](); 
    var index = 0; 
    var output; 

    return { 
     [Symbol.iterator] : function() { return this; }, 
     next : function() { 
      if (!(output = elements.next()).done) 
       output.value = [index++, output.value]; 
      return output; 
     } 
    }; 
}}); 

/*other code*/ 

for (let [index, ch] of 'abcd'.indexerator) 
    console.log(index + ':' + ch); 

demonstrations

+0

Per una stringa, puoi semplicemente includere '.split ('')' per convertire la stringa in una matrice di caratteri e quindi procedere come al solito, cioè 'for (let [index, ch] of 'abcd'.split (' ') .entries()) {...} '. –

+1

Freddo. Era solo un esempio facilmente comprensibile, la tua soluzione funzionerà per le stringhe ma non ti aiuterà se hai bisogno di patch, dì un 'NodeList' su browser webkit leggermente più vecchi (che, per qualche ragione, supportano gli iteratori ma NodeList non è stato ancora creato essere uno stesso).Dovendo scrivere quella lunga espressione ogni volta che si voleva fare qualcosa di simile in un progetto sarebbe ingombrante, nel qual caso probabilmente si finirebbe per trasformarlo in una funzione, rendendolo non meno complicato della soluzione qui comunque (' .indexerator', la funzione di patching è appena definita una volta nascosta in un'utilità da qualche parte). – Hashbrown

+0

@AndrewWillems Se la stringa non sta convertendo in un array uno spreco di memoria e può causare problemi? Meglio aggiungere il tuo indice. – codeAligned