Итерация свойств объекта JavaScript с помощью jQuery

116

Есть ли способ jQuery для выполнения итерации по членам объекта, например:

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

Мне просто не нравится, что это forвыделяется из моей прекрасной нотации jQuery!

tags2k
источник

Ответы:

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

каждый

Тим Бют
источник
Также я предполагаю, что это оповещение nне совсем корректно. По крайней мере, это могло бытьn.name
Евгений
2
@ Евгений: Я не понимаю твоей точки зрения. Каждая функция принимает массив или объект в качестве первого аргумента и функцию в качестве второго. Эта функция вызывается для каждого элемента в массиве / для каждого свойства объекта. Каждый раз, когда функция вызывается, она получает индекс и значение / имя и значение, переданные в качестве аргументов. В моем примере параметр «n» - это две строки «John» и «JS». Свойство «name» будет «undefined».
Тим Бют
Ага. Я ошибся здесь. Как-то я подумал, что каждое свойство объекта - это другой объект, например, имя свойства, которое является строкой. Конечно, все это неправильно. Так жаль. :)
Евгений
4
у каждого есть гораздо больше возможностей: thisтоже n. return falseразрывает каждую петлю ...
Энди
56

Вы также можете использовать eachдля объектов, а не только для массивов:

var obj = {
    foo: "bar",
    baz: "quux"
};
jQuery.each(obj, function(name, value) {
    alert(name + ": " + value);
});
гумбо
источник
9

Этот метод просматривает свойства объекта и записывает их в консоль с увеличивающимся отступом:

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

Просто передайте ему объект, который вы хотите перебрать:

var response = $.ajax({
    url: myurl,
    dataType: "json"
})
.done(function(a){
   console.log("Returned values:");
   enumerate(a);
})
.fail(function(){ console.log("request failed");});
jonathanbruder
источник
Использование этого, когда значение равно null, ошибки с «Uncaught TypeError: Cannot read property 'length' of null»
JustinStolle
3

Поздно, но это можно сделать с помощью Object.keys, например,

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>

Рохан Кумар
источник