Respuestas:
(Actualización: mi otra respuesta aquí presenta las opciones que no son jQuery mucho más a fondo. Sin jQuery.each
embargo , la tercera opción a continuación no está incluida).
Cuatro opciones:
var i;
for (i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
o en ES2015 +:
for (let i = 0; i < substr.length; ++i) {
// do something with `substr[i]`
}
Ventajas : directo, sin dependencia de jQuery, fácil de entender, sin problemas para preservar el significado this
dentro del cuerpo del bucle, sin sobrecarga innecesaria de llamadas a funciones (por ejemplo, en teoría más rápido, aunque de hecho tendría que tiene tantos elementos que lo más probable es que tenga otros problemas ( detalles ).
forEach
:A partir de ECMAScript5, las matrices tienen una forEach
función en ellas que facilita el bucle a través de la matriz:
substr.forEach(function(item) {
// do something with `item`
});
(Nota: hay muchas otras funciones, no solo forEach
; consulte la respuesta mencionada anteriormente para obtener más detalles).
Ventajas : declarativo, puede usar una función preconstruida para el iterador si tiene uno a mano, si su cuerpo de bucle es complejo, el alcance de una llamada de función a veces es útil, no necesita una i
variable en su ámbito de contención.
Desventajas : Si usted está usando this
en el código que contiene y que desea utilizar this
dentro de su forEach
devolución de llamada, que tienen que o bien A) Pegúela en una variable, de forma que se puede utilizar dentro de la función, B) lo pasa como segundo argumento a forEach
por lo forEach
lo configura como this
durante la devolución de llamada, o C) Use una función de flecha ES2015 + , que se cierra this
. Si no hace una de esas cosas, la devolución de llamada this
será undefined
(en modo estricto) o el objeto global ( window
) en modo suelto. Solía haber una segunda desventaja que forEach
no era universalmente compatible, pero aquí en 2018, el único navegador con el que se encontrará que no tiene forEach
es IE8 (y no puede ser correctamente) polirellenado allí, tampoco
for-of
:for (const s of substr) { // Or `let` if you want to modify it in the loop body
// do something with `s`
}
Vea la respuesta vinculada en la parte superior de esta respuesta para obtener detalles sobre cómo funciona.
Ventajas : Simple, directo, ofrece una variable de alcance contenido (o constante, en lo anterior) para la entrada de la matriz.
Desventajas : No es compatible con ninguna versión de IE.
jQuery.each(substr, function(index, item) {
// do something with `item` (or `this` is also `item` if you like)
});
Ventajas : todas las mismas ventajas que forEach
, además, sabes que está ahí ya que estás usando jQuery.
Desventajas : si está usando this
el código que lo contiene, debe pegarlo en una variable para poder usarlo dentro de la función, ya que this
significa algo más dentro de la función.
Sin this
embargo, puedes evitarlo 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 en ES2015 ("ES6"), una función de flecha:
jQuery.each(substr, (index, item) => {
// do something with `item` (`this` is the same as it was outside)
});
No lo use for..in
para esto (o si lo hace, hágalo con las garantías adecuadas). Verá gente que dice (de hecho, brevemente hubo una respuesta aquí que dice eso), pero for..in
no hace lo que mucha gente piensa que hace (¡hace algo aún más útil!). Específicamente, for..in
recorre los nombres de propiedades enumerables de un objeto (no los índices de una matriz). Dado que las matrices son objetos, y sus únicas propiedades enumerables de forma predeterminada son los índices, en su mayoría parece funcionar en una implementación suave. Pero no es una suposición segura de que solo puede usarlo para eso. Aquí hay una exploración: http://jsbin.com/exohi/3
Debería suavizar el "no" anterior. Si se trata de matrices dispersas (p. Ej., La matriz tiene 15 elementos en total, pero sus índices están esparcidos en el rango de 0 a 150,000 por alguna razón, por lo que length
es 150,001), y si usa las salvaguardas apropiadas, como hasOwnProperty
y verificando El nombre de la propiedad es realmente numérico (consulte el enlace anterior), for..in
puede ser una forma perfectamente razonable de evitar muchos bucles innecesarios, ya que solo se enumerarán los índices poblados.
Function#bind
. :-) Buen punto, añadido.
i++
y ++i
es el resultado de esa expresión, que nunca se usa en el ejemplo anterior. Un for
bucle funciona así: 1. Inicialización, 2. Prueba (terminar si es falso), 3. Cuerpo, 4. Actualizar, 5. Volver al paso 2. El resultado de la expresión de actualización no se utiliza para nada.
jQuery.each(array, callback)
iteración de matriz
jQuery.each(array, function(Integer index, Object value){});
iteración de objeto
jQuery.each(object, function(string propertyName, object propertyValue){});
ejemplo :
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>
en bucle
for (initialExpression; condition; incrementExpression)
statement
ejemplo
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])
}
para en
//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
}
para de
for(var i of subs) {
//can use break;
console.log(i); //note i returns value
}
para cada
substr.forEach(function(v, i, a){
//cannot use break;
console.log(v, i, a);
})
No hay necesidad de jquery aquí, solo un for
bucle funciona:
var substr = currnt_image_list.split(',');
for(var i=0; i< substr.length; i++) {
alert(substr[i]);
}
for
bucle tradicionalUn for
bucle tradicional tiene tres componentes:
Estos tres componentes están separados entre sí por un ;
símbolo. El contenido de cada uno de estos tres componentes es opcional, lo que significa que el siguiente es el for
bucle más mínimo posible:
for (;;) {
// Do stuff
}
Por supuesto, deberá incluir un if(condition === true) { break; }
o un if(condition === true) { return; }
lugar dentro de ese for
bucle para que deje de funcionar.
Por lo general, sin embargo, la inicialización se usa para declarar un índice, la condición se usa para comparar ese índice con un valor mínimo o máximo, y la idea de último momento se usa para incrementar el índice:
for (var i = 0, length = 10; i < length; i++) {
console.log(i);
}
for
bucle tradicional para recorrer una matrizLa forma tradicional de recorrer una matriz es esta:
for (var i = 0, length = myArray.length; i < length; i++) {
console.log(myArray[i]);
}
O, si prefiere hacer un bucle hacia atrás, haga esto:
for (var i = myArray.length - 1; i > -1; i--) {
console.log(myArray[i]);
}
Sin embargo, hay muchas variaciones posibles, como por ejemplo. éste :
for (var key = 0, value = myArray[key], var length = myArray.length; key < length; value = myArray[++key]) {
console.log(value);
}
... o este ...
var i = 0, length = myArray.length;
for (; i < length;) {
console.log(myArray[i]);
i++;
}
... o este :
var key = 0, value;
for (; value = myArray[key++];){
console.log(value);
}
Lo que funcione mejor depende en gran medida del gusto personal y del caso de uso específico que está implementando.
Nota :Cada una de estas variaciones es compatible con todos los navegadores, incluidos los más antiguos.
while
bucleUna alternativa a un for
bucle es un while
bucle. Para recorrer una matriz, puede hacer esto:
var key = 0;
while(value = myArray[key++]){
console.log(value);
}
Nota :
Al igual que los for
bucles tradicionales , los while
bucles son compatibles incluso con los navegadores más antiguos.
Además, cada bucle while se puede reescribir como un for
bucle. Por ejemplo, el while
-loop aquí arriba se comporta exactamente de la misma manera que este for
-loop:
for(var key = 0;value = myArray[key++];){
console.log(value);
}
for...in
yfor...of
En JavaScript, también puedes hacer esto:
for (i in myArray) {
console.log(myArray[i]);
}
Sin embargo, esto debe usarse con cuidado, ya que no se comporta igual que un for
bucle tradicional en todos los casos, y hay posibles efectos secundarios que deben considerarse. Vea ¿Por qué usar "for ... in" con iteración de matriz es una mala idea? para más detalles.
Como alternativa a for...in
, ahora también hay para for...of
. El siguiente ejemplo muestra la diferencia entre un for...of
bucle y un for...in
bucle:
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 :
También debe tener en cuenta que ninguna versión de Internet Explorer es compatible for...of
( Edge 12+ lo hace) y eso for...in
requiere al menos IE10.
Array.prototype.forEach()
Una alternativa a For
-loops es Array.prototype.forEach()
, que usa la siguiente sintaxis:
myArray.forEach(function(value, key, myArray) {
console.log(value);
});
Nota :
Array.prototype.forEach()
es compatible con todos los navegadores modernos, así como con IE9 +.
jQuery.each()
Además de las otras cuatro opciones mencionadas, jQuery también tenía su propia foreach
variación.
Utiliza la siguiente sintaxis:
$.each(myArray, function(key, value) {
console.log(value);
});
Utiliza la each()
función de jQuery.
Aquí hay un ejemplo:
$.each(currnt_image_list.split(','), function(index, value) {
alert(index + ': ' + value);
});
Usa jQuery each()
. Hay otras formas, pero cada una está diseñada para este propósito.
$.each(substr, function(index, value) {
alert(value);
});
Y no coloque la coma después del último número.
Sintaxis ES6 con función de flecha e interpolación:
var data=["a","b","c"];
$(data).each((index, element) => {
console.log(`current index : ${index} element : ${element}`)
});
Prueba esto:
$.grep(array, function(element) {
})
Formas alternativas de iteración a través de una matriz / cadena con efectos secundarios
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()
ofor...in
para recorrer una matriz es, en general, una mala idea. Es como las edades más lentas que usarfor
owhile
. Usar unfor loop
incluso es una gran idea almacenar en caché lalength
propiedad antes de hacer un bucle.for (var i = 0, len = substr.length; i < len; ...