Iterando las propiedades de un objeto JavaScript usando jQuery

116

¿Existe una forma jQuery de realizar iteraciones sobre los miembros de un objeto, como en:

    for (var member in obj) {
        ...
    }

¡Simplemente no me gusta que esto forsobresalga de mi encantadora notación jQuery!

etiquetas2k
fuente

Respuestas:

210
$.each( { name: "John", lang: "JS" }, function(i, n){
    alert( "Name: " + i + ", Value: " + n );
});

cada

Tim Büthe
fuente
También supongo que la alerta nno es del todo correcta. Al menos podría sern.name
Eugene
2
@Eugene: No entiendo tu punto. Cada función toma una matriz u objeto como primer argumento y una función como segundo. Esta función se llama para cada elemento de la matriz / cada propiedad del objeto. Cada vez que se llama a la función, obtiene el índice y el valor / nombre y el valor pasados ​​como argumentos. En mi ejemplo, el parámetro "n" son las dos cadenas "John" y "JS". La propiedad "nombre" sería "indefinida".
Tim Büthe
Sí. Me equivoqué aquí. De alguna manera pensé que cada propiedad en el objeto es otro objeto con, por ejemplo, el nombre de la propiedad, que es una cadena. Por supuesto, todo eso está mal. Lo siento mucho. :)
Eugene
4
cada uno tiene muchas más características: thises también n. return falserompe cada bucle ...
Andy
56

También puede usar eachpara objetos y no solo para matrices:

var obj = {
    foo: "bar",
    baz: "quux"
};
jQuery.each(obj, function(name, value) {
    alert(name + ": " + value);
});
Gumbo
fuente
9

Este método recorrerá las propiedades del objeto y las escribirá en la consola con sangría creciente:

function enumerate(o,s){

    //if s isn't defined, set it to an empty string
    s = typeof s !== 'undefined' ? s : "";

    //iterate across o, passing keys as k and values as v
    $.each(o, function(k,v){

        //if v has nested depth
        if(typeof v == "object"){

            //write the key to the console
            console.log(s+k+": ");

            //recursively call enumerate on the nested properties
            enumerate(v,s+"  ");

        } else {

            //log the key & value
            console.log(s+k+": "+String(v));
        }
    });
}

Simplemente páselo por el objeto que desea iterar:

var response = $.ajax({
    url: myurl,
    dataType: "json"
})
.done(function(a){
   console.log("Returned values:");
   enumerate(a);
})
.fail(function(){ console.log("request failed");});
jonathanbruder
fuente
Usar esto cuando un valor es nulo errores con "Error de tipo no detectado: no se puede leer la propiedad 'longitud' de nulo"
JustinStolle
3

Tarde, pero se puede hacer usando Object.keys como,

var a={key1:'value1',key2:'value2',key3:'value3',key4:'value4'},
  ulkeys=document.getElementById('object-keys'),str='';
var keys = Object.keys(a);
for(i=0,l=keys.length;i<l;i++){
   str+= '<li>'+keys[i]+' : '+a[keys[i]]+'</li>';
}
ulkeys.innerHTML=str;
<ul id="object-keys"></ul>

Rohan Kumar
fuente