Cómo hacer un bucle a través de una matriz en jQuery?


Estoy tratando de hacer un bucle a través de una matriz. Tengo el siguiente código:

 var substr = currnt_image_list.split(','); //This will split up 21,32,234,223,

Estoy tratando de obtener todos los datos de la matriz. ¿Puede alguien guiarme por el camino correcto, por favor?

Author: John Slegers, 2010-10-15

7 answers


(Actualizar: Mi otra respuesta aquí establece las opciones que no son de jQuery mucho más a fondo. Sin embargo, la tercera opción a continuación, jQuery.each, no está en ella.)


Tres opciones:

Bucle genérico:

var i;
for (i = 0; i < substr.length; ++i) {
    // do something with `substr[i]`
}

Ventajas : Sencillo, sin dependencia de jQuery, fácil de entender, sin problemas para preservar el significado de this dentro del cuerpo del bucle, sin sobrecarga innecesaria de llamadas a funciones (por ejemplo, en la teoría más rápido, aunque en hecho tendrías que tener tantos elementos que las probabilidades son que tendrías otros problemas; detalles ).

ES5 forEach:

A partir de ECMAScript5, los arrays tienen una función forEach en ellos que facilita el bucle a través del array:

substr.forEach(function(item) {
    // do something with `item`
});

Enlace a documentos

(Nota: Hay muchas otras funciones, no solo forEach; vea la respuesta mencionada anteriormente para más detalles.)

Ventajas : Declarativo, puede utilizar un función precompilada para el iterador si tiene una a mano, si el cuerpo del bucle es complejo, el alcance de una llamada a una función a veces es útil, sin necesidad de una variable i en su ámbito contenedor.

Desventajas: No todos los navegadores lo tienen todavía, aunque la mayoría lo tienen, y siempre puede usar una cuña ES5 (una búsqueda enumerará varios) para proporcionarlo en navegadores que aún no lo tienen. Si estás usando this en el código que contiene, tienes que pegarlo en una variable para poder usarla dentro de la función o pasarlo como un segundo argumento a forEach, ya que dentro de la función de iteración, this será undefined (en modo estricto) o el objeto global (window) en modo no estricto a menos que le dé forEach un valor específico.

JQuery.cada uno:

jQuery.each(substr, function(index, item) {
    // do something with `item` (or `this` is also `item` if you like)
});

(Link to docs )

Ventajas : Todas las mismas ventajas que forEach, además de que sabes que está ahí ya que estás usando jQuery.

Desventajas : Si está utilizando this en el código que contiene, tiene que pegarlo en una variable para que pueda usarlo dentro de la función, ya que this significa algo más dentro de la función.

Puede evitar la cosa this, ya sea 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)
});

¿Qué NO hacer:

No use for..in para esto (o si lo hace, hágalo con las salvaguardias adecuadas). Verás gente decir a (de hecho, brevemente había una respuesta aquí diciendo 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 los arrays son objetos, y sus únicas propiedades enumerables por defecto son los índices, en su mayoría parece funcionar en una implementación blanda. Pero no es una suposición segura de que solo se puede utilizar para eso. He aquí una exploración: http://jsbin.com/exohi/3

Debería suavizar el "no" de arriba. Si está tratando con matrices dispersas (por ejemplo, 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, y por lo tanto el length es 150,001), y si usa salvaguardas apropiadas como hasOwnProperty y comprueba que el nombre de la propiedad es realmente numérico (consulte el enlace anterior), for..in puede ser una manera perfectamente razonable de evitar bucles, ya que solo se enumerarán los índices poblados.

 415
Author: T.J. Crowder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:37

JQuery.cada uno()

JQuery.cada uno()

jQuery.each(array, callback)

Iteración de matriz

jQuery.each(array, function(Integer index, Object value){});

Iteración de objetos

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>

Bucles Javascript para array

For loop

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 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
}

Para de

for(var i of subs) {
    //can use break;
    console.log(i); //note i returns value
}

ForEach

substr.forEach(function(v, i, a){
    //cannot use break;
    console.log(v, i, a);
})

Recursos

Bucles MDN e iteradores

 54
Author: skyfoot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-30 12:05:32

No hay necesidad de jquery aquí solo funciona un bucle for:

var substr = currnt_image_list.split(',');
for(var i=0; i< substr.length; i++) {
  alert(substr[i]);
}
 19
Author: Nick Craver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-15 15:07:39

Opción 1: La tradicional for-bucle

Lo básico

Un bucle tradicional for tiene tres componentes:

  1. la inicialización : ejecutada antes de que el bloque look se ejecute la primera vez
  2. la condición: comprueba una condición cada vez antes de que se ejecute el bloque de bucle, y sale del bucle si es false
  3. el pensamiento posterior: realizado cada vez después del bloque de bucle es ejecutado

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 bucle for más mínimo posible:

for (;;) {
    // Do stuff
}

Por supuesto, necesitará incluir un if(condition === true) { break; } o un if(condition === true) { return; } en algún lugar dentro de ese for-loop para que deje de ejecutarse.

Normalmente, 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 utiliza para incrementar el índice:

for (var i = 0, length = 10; i < length; i++) {
    console.log(i);
}

Usando un tradtional for-bucle a bucle a través de una matriz

La forma tradicional de recorrer un array es la siguiente:

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]);
}

Hay, sin embargo, muchas variaciones posibles, como por ejemplo. este :

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 es en gran medida una cuestión de gusto personal y el caso de uso específico que está implementando.

Nota:

Cada una de estas variaciones es compatible con todos los navegadores, incluidos los antiguos de véry!


Opción 2 : El while-bucle

Una alternativa a un for-loop es un while-loop. Para recorrer un array, puedes hacer esto:

var key = 0;
while(value = myArray[key++]){
    console.log(value);
}
Nota:

Como los bucles tradicionales for, while - bucles son compatibles incluso con los navegadores más antiguos.

Además, cada bucle while se puede reescribir como un bucle for -. 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);
}

Opción 3 : for...in y for...of

En JavaScript, también puede hacer esto:

for (i in myArray) {
    console.log(myArray[i]);
}

Esto debe usarse con cuidado, sin embargo, ya que no se comporta igual que un bucle tradicional for en todos los casos, y hay potencial efectos secundarios que deben tenerse en cuenta. Véase Por qué está usando "for...in" with array iteration a bad idea? para más detalles.

Como una alternativa a la for...in, ahora hay también para for...of. El siguiente ejemplo muestra la diferencia entre un bucle for...of y un bucle for...in:

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 admite for...of (Borde 12+ does) y que for...in requiere al menos IE10.


Opción 4 : 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 IE9+.


Opción 5 : jQuery.each()

Además de las otras cuatro opciones mencionadas, jQuery también tenía su propio foreach variaciones.

Utiliza la siguiente sintaxis :

$.each(myArray, function(key, value) {
    console.log(value);
});
 17
Author: John Slegers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:47:14

Utilice el each() función de jQuery.

Aquí hay un ejemplo:

$.each(currnt_image_list.split(','), function(index, value) { 
  alert(index + ': ' + value); 
});
 15
Author: romaintaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-15 15:06:55

Usa Jquery cada uno. Hay otras formas, pero cada una está diseñada para este propósito.

$.each(substr, function(index, value) { 
  alert(value); 
});

Y no ponga la coma después del último número.

 5
Author: MItrajyoti Kusari,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-20 10:30:24

Puedes usar un bucle for:

var things = currnt_image_list.split(','); 
for(var i = 0; i < things.length; i++) {
    //Do things with things[i]
}
 2
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-15 15:07:23