122

Is there a jQuery way to perform iteration over an object's members, such as in:

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

I just don't like this for sticking out from amongst my lovely jQuery notation!

0

4 Answers 4

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

each

Sign up to request clarification or add additional context in comments.

6 Comments

Also I guess, that alerting n isn't intirely correct. At least it could be n.name
@Eugene: I don't get your point. The each function takes an array or object as the first argument and a function as a second. This functions gets calld for every element in the array / every property in the object. Every time the function is called, it get the index and value / name and value passed in as arguments. In my example the parameter "n" are the two string "John" and "JS". The "name" property would be "undefined".
Yep. I was wrong here. Somehow I thought, that every property in object is another object with for example property name which is a string. Of cource all of that is wrong. So sorry. :)
each has got much more features: this is also n. return false breaks the each loop...
i and n seriously? Why not index and name to keep things clean? You did teach me something new though in that $.each(obj, callback) doesn't do the same as $(obj).each(callback), so much appreciated. Upvoted.
|
56

You can use each for objects too and not just for arrays:

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

Comments

9

Note: Most modern browsers will now allow you to navigate objects in the developer console. This answer is antiquated.

This method will walk through object properties and write them to the console with increasing indent:

function enumerate(o,s){

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

    //if o is null, we need to output and bail
    if(typeof o == "object" && o === null){

       console.log(s+k+": null");

    } else {    

        //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" && v !== null){

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

Just pass it the object you want to iterate through:

    var response = $.ajax({
        url: myurl,
        dataType: "json"
    })
    .done(function(a){
       console.log("Returned values:");
       enumerate(a);
    })
    .fail(function(){ console.log("request failed");});

1 Comment

Using this when a value is null errors with "Uncaught TypeError: Cannot read property 'length' of null"
4

Late, but can be done by using Object.keys like,

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>

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.