Iterando as propriedades de um objeto JavaScript usando jQuery

116

Existe uma maneira jQuery de realizar iteração sobre os membros de um objeto, como em:

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

Eu simplesmente não gosto que isso forse destaque na minha adorável notação jQuery!

tags2k
fonte

Respostas:

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

cada

Tim Büthe
fonte
Além disso, acho que esse alerta nnão está totalmente correto. Pelo menos poderia sern.name
Eugene
2
@Eugene: Não entendi. Cada função recebe uma matriz ou objeto como primeiro argumento e uma função como segundo. Esta função é chamada para cada elemento no array / cada propriedade do objeto. Cada vez que a função é chamada, ela obtém o índice e o valor / nome e o valor passados ​​como argumentos. No meu exemplo, o parâmetro "n" são as duas strings "John" e "JS". A propriedade "nome" seria "indefinida".
Tim Büthe
Sim. Eu estava errado aqui. De alguma forma, pensei que cada propriedade em objeto é outro objeto com, por exemplo, o nome de propriedade que é uma string. É claro que tudo isso está errado. Sinto muito. :)
Eugene
4
cada um tem muito mais recursos: thistambém n. return falsequebra cada loop ...
andy
56

Você também pode usar eachpara objetos e não apenas para matrizes:

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

Este método percorrerá as propriedades do objeto e as gravará no console com recuo crescente:

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

Basta passar o objeto que você deseja iterar:

var response = $.ajax({
    url: myurl,
    dataType: "json"
})
.done(function(a){
   console.log("Returned values:");
   enumerate(a);
})
.fail(function(){ console.log("request failed");});
Jonathanbruder
fonte
Usando isto quando um valor é nulo erros com "Uncaught TypeError: Cannot read property 'length' of null"
JustinStolle
3

Atrasado, mas pode ser feito 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
fonte