Risposte:
(Aggiornamento: la mia altra risposta qui espone le opzioni non jQuery in modo molto più approfondito. La terza opzione in basso, tuttavia jQuery.each
, non è inclusa.)
Quattro opzioni:
var i;
for (i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
o in ES2015 +:
for (let i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
Vantaggi : diretto, nessuna dipendenza da jQuery, facile da capire, nessun problema con la preservazione del significato this
all'interno del corpo del loop, nessun sovraccarico inutile di chiamate di funzione (ad es., In teoria più veloce, anche se in realtà dovresti avere così tanti elementi che le probabilità sono che avresti altri problemi; dettagli ).
forEach
:A partire da ECMAScript5, gli array hanno una forEach
funzione su di essi che semplifica il loop attraverso l'array:
substr.forEach(function(item) {
// do something with `item`
});
(Nota: ci sono molte altre funzioni, non solo forEach
; vedere la risposta a cui si fa riferimento sopra per i dettagli.)
Vantaggi : dichiarativo, può utilizzare una funzione predefinita per l'iteratore se ne hai una a portata di mano, se il tuo corpo del ciclo è complesso lo scoping di una chiamata di funzione è talvolta utile, non è necessaria una i
variabile nel tuo ambito di contenimento.
Svantaggi : Se utilizzi this
il codice che contiene e che si desidera utilizzare this
all'interno forEach
di richiamata, è necessario sia a) del bastone in una variabile in modo da poter utilizzare all'interno della funzione, B) Far passare come secondo argomento di forEach
così forEach
imposta come this
durante il callback, o C) Utilizzare una funzione freccia ES2015 + , che si chiude this
. Se non si esegue una di queste operazioni, nella richiamata this
sarà undefined
(in modalità rigorosa) o l'oggetto globale ( window
) in modalità libera. C'era un secondo svantaggio che forEach
non era universalmente supportato, ma qui nel 2018, l'unico browser in cui ti imbatterai non ha forEach
IE8 (e non può essere correttamente lì polifillato).
for-of
:for (const s of substr) { // Or `let` if you want to modify it in the loop body
// do something with `s`
}
Vedi la risposta collegata nella parte superiore di questa risposta per i dettagli su come funziona.
Vantaggi : semplice, diretto, offre una variabile di ambito contenuto (o costante, sopra) per l'ingresso dall'array.
Svantaggi : non supportato in nessuna versione di IE.
jQuery.each(substr, function(index, item) {
// do something with `item` (or `this` is also `item` if you like)
});
Vantaggi : tutti gli stessi vantaggi di forEach
, inoltre sai che è lì poiché stai usando jQuery.
Svantaggi : se si utilizza this
nel codice contenente, è necessario inserirlo in una variabile in modo da poterlo utilizzare all'interno della funzione, poiché this
significa qualcos'altro all'interno della funzione.
Puoi evitare la this
cosa però, usando $.proxy
:
jQuery.each(substr, $.proxy(function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}, this));
... o Function#bind
:
jQuery.each(substr, function(index, item) {
// do something with `item` (`this` is the same as it was outside)
}.bind(this));
... o in ES2015 ("ES6"), una funzione freccia:
jQuery.each(substr, (index, item) => {
// do something with `item` (`this` is the same as it was outside)
});
Non usare for..in
per questo (o se lo fai, fallo con le dovute garanzie). Vedrai le persone dire (in effetti, qui brevemente c'è stata una risposta che lo dice), ma for..in
non fa ciò che molte persone pensano che faccia (fa qualcosa di ancora più utile!). In particolare, for..in
scorre i nomi delle proprietà enumerabili di un oggetto (non gli indici di un array). Poiché le matrici sono oggetti e le loro uniche proprietà enumerabili per impostazione predefinita sono gli indici, sembra quasi funzionare in una distribuzione blanda. Ma non è un presupposto sicuro che puoi semplicemente usarlo per quello. Ecco un'esplorazione: http://jsbin.com/exohi/3
Dovrei ammorbidire il "non" sopra. Se hai a che fare con array sparsi (ad esempio, l'array ha 15 elementi in totale ma i loro indici sono sparsi nell'intervallo da 0 a 150.000 per qualche motivo, e quindi length
è 150.001), e se usi le garanzie appropriate come hasOwnProperty
e controllando il il nome della proprietà è veramente numerico (vedi link sopra), for..in
può essere un modo perfettamente ragionevole per evitare molti cicli inutili, poiché verranno elencati solo gli indici popolati.
Function#bind
. :-) Buon punto, aggiunto.
i++
e ++i
è il risultato di quell'espressione, che non è mai stata usata nell'esempio sopra. Un for
ciclo funziona in questo modo: 1. Inizializzazione, 2. Test (termina se falso), 3. Corpo, 4. Aggiornamento, 5. Torna al passaggio 2. Il risultato dell'espressione di aggiornamento non viene utilizzato per nulla.
jQuery.each(array, callback)
iterazione di array
jQuery.each(array, function(Integer index, Object value){});
iterazione dell'oggetto
jQuery.each(object, function(string propertyName, object propertyValue){});
esempio :
var substr = [1, 2, 3, 4];
$.each(substr , function(index, val) {
console.log(index, val)
});
var myObj = { firstName: "skyfoot"};
$.each(myObj, function(propName, propVal) {
console.log(propName, propVal);
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
per loop
for (initialExpression; condition; incrementExpression)
statement
esempio
var substr = [1, 2, 3, 4];
//loop from 0 index to max index
for(var i = 0; i < substr.length; i++) {
console.log("loop", substr[i])
}
//reverse loop
for(var i = substr.length-1; i >= 0; i--) {
console.log("reverse", substr[i])
}
//step loop
for(var i = 0; i < substr.length; i+=2) {
console.log("step", substr[i])
}
per in
//dont really wnt to use this on arrays, use it on objects
for(var i in substr) {
console.log(substr[i]) //note i returns index
}
per di
for(var i of subs) {
//can use break;
console.log(i); //note i returns value
}
per ciascuno
substr.forEach(function(v, i, a){
//cannot use break;
console.log(v, i, a);
})
Non c'è bisogno di jquery qui, solo un for
ciclo funziona:
var substr = currnt_image_list.split(',');
for(var i=0; i< substr.length; i++) {
alert(substr[i]);
}
for
-loopUn for
loop tradizionale ha tre componenti:
Questi tre componenti sono separati l'uno dall'altro da un ;
simbolo. Il contenuto di ciascuno di questi tre componenti è facoltativo, il che significa che il seguente è il più for
scarso possibile:
for (;;) {
// Do stuff
}
Ovviamente, dovrai includere un if(condition === true) { break; }
o un if(condition === true) { return; }
posto all'internofor
-loop per farlo smettere di funzionare.
Di solito, tuttavia, l'inizializzazione viene utilizzata per dichiarare un indice, la condizione viene utilizzata per confrontare quell'indice con un valore minimo o massimo e il ripensamento viene utilizzato per incrementare l'indice:
for (var i = 0, length = 10; i < length; i++) {
console.log(i);
}
for
tradlo -loop per eseguire il loop in un arrayIl modo tradizionale per eseguire il loop in un array è questo:
for (var i = 0, length = myArray.length; i < length; i++) {
console.log(myArray[i]);
}
Oppure, se si preferisce eseguire il looping all'indietro, procedere come segue:
for (var i = myArray.length - 1; i > -1; i--) {
console.log(myArray[i]);
}
Vi sono, tuttavia, molte varianti possibili, come ad es. questo :
for (var key = 0, value = myArray[key], var length = myArray.length; key < length; value = myArray[++key]) {
console.log(value);
}
... o questo ...
var i = 0, length = myArray.length;
for (; i < length;) {
console.log(myArray[i]);
i++;
}
... o questo:
var key = 0, value;
for (; value = myArray[key++];){
console.log(value);
}
Qualunque cosa funzioni meglio è in gran parte una questione di gusti personali e del caso d'uso specifico che stai implementando.
Nota :Ognuna di queste varianti è supportata da tutti i browser, compresi quelli più vecchi!
while
-loopUn'alternativa a un for
-loop è un while
-loop. Per eseguire il loop attraverso un array, è possibile effettuare ciò:
var key = 0;
while(value = myArray[key++]){
console.log(value);
}
Nota :
Come i tradizionali for
-loops, while
-loops sono supportati anche dal più vecchio dei browser.
Inoltre, ogni ciclo while può essere riscritto come for
-loop. Ad esempio, il while
-loop qui sopra si comporta esattamente allo stesso modo di questo for
-loop:
for(var key = 0;value = myArray[key++];){
console.log(value);
}
for...in
efor...of
In JavaScript, puoi anche fare questo:
for (i in myArray) {
console.log(myArray[i]);
}
Questo dovrebbe essere usato con cautela, tuttavia, poiché non si comporta in modo simile a un for
cerchio tradizionale in tutti i casi e ci sono potenziali effetti collaterali che devono essere considerati. Vedi Perché usare "for ... in" con l'iterazione dell'array è una cattiva idea?per ulteriori dettagli.
In alternativa a for...in
, ora c'è anche per for...of
. L'esempio seguente mostra la differenza tra un for...of
loop e un for...in
loop:
var myArray = [3, 5, 7];
myArray.foo = "hello";
for (var i in myArray) {
console.log(i); // logs 0, 1, 2, "foo"
}
for (var i of myArray) {
console.log(i); // logs 3, 5, 7
}
Nota :
È inoltre necessario considerare che nessuna versione di Internet Explorer supporta for...of
( Edge 12+ ) e che for...in
richiede almeno IE10.
Array.prototype.forEach()
Un'alternativa a For
-loops è Array.prototype.forEach()
, che utilizza la sintassi seguente:
myArray.forEach(function(value, key, myArray) {
console.log(value);
});
Nota :
Array.prototype.forEach()
è supportato da tutti i browser moderni, nonché da IE9 +.
jQuery.each()
Oltre alle altre quattro opzioni menzionate, anche jQuery aveva le sue foreach
variante.
Utilizza la sintassi seguente:
$.each(myArray, function(key, value) {
console.log(value);
});
Utilizzare il each()
funzione di jQuery.
Ecco un esempio:
$.each(currnt_image_list.split(','), function(index, value) {
alert(index + ': ' + value);
});
Usa jQuery each()
. Ci sono altri modi, ma ognuno è progettato per questo scopo.
$.each(substr, function(index, value) {
alert(value);
});
E non inserire la virgola dopo l'ultimo numero.
Sintassi ES6 con funzione freccia e interpolazione:
var data=["a","b","c"];
$(data).each((index, element) => {
console.log(`current index : ${index} element : ${element}`)
});
Prova questo:
$.grep(array, function(element) {
})
Modi alternativi di iterazione tramite array / stringa con effetti collaterali
var str = '21,32,234,223';
var substr = str.split(',');
substr.reduce((a,x)=> console.log('reduce',x), 0) // return undefined
substr.every(x=> { console.log('every',x); return true}) // return true
substr.some(x=> { console.log('some',x); return false}) // return false
substr.map(x=> console.log('map',x)); // return array
str.replace(/(\d+)/g, x=> console.log('replace',x)) // return string
.each()
o ilfor...in
loop su un array è generalmente una cattiva idea. È come un'età più lenta dell'uso difor
owhile
. Usando afor loop
è persino una buona idea memorizzare nella cache lalength
proprietà prima di eseguire il loop.for (var i = 0, len = substr.length; i < len; ...