Jack
Jack

Reputation: 10613

JavaScript for in loop, but in reverse?

Taking a JavaScript object with 4 properties:

function Object() {
  this.prop1;
  this.prop2;
  this.prop3;
  this.prop4;
}

var obj = new Object();

I use a for(in) loop to inspect each property since I don't know the number or name of the properties:

for(property in obj) {
  var prop = obj[property];
}

However I would like to process the properties starting with the last (prop4 in this example). I suppose I would like a reverse-for-in-loop.

How can I do this?

Thanks, Jack

Adding: The object I am referring to is the one returned from JSON.parse. The properties seem to be consistently ordered. There is no keys() method.

Upvotes: 8

Views: 19675

Answers (3)

jfriend00
jfriend00

Reputation: 707308

A for (x in y) does not process the properties in any specific order so you cannot count on any desired order.

If you need to process the properties in a specific order, you will need to get all the properties into an array, sort the array appropriately and then use those keys in the desired order.

Using ES5 (or an ES5 shim), you can get all properties into an array with:

var keys = Object.keys(obj);

You could then sort them either in standard lexical order or sort with your own custom function:

keys.sort(fn);

And, then you could access them in your desired order:

for (var i = 0; i < keys.length; i++) {
    // process obj[keys[i]]
}

Upvotes: 15

vol7ron
vol7ron

Reputation: 42099

Arrays are ordered objects. Properties in objects are inherently unordered. However, if you have some specific reason that you want to work from back to front of whatever the for..in construct would have produced, you could do:

var arr = [];
for (prop in obj) {
   arr.push(prop);
}

for (var n=arr.length; n--; ){
   var prop = obj[arr[n]];
}

Upvotes: 2

dwerner
dwerner

Reputation: 6602

The ECMAScript standard does not define an order to iteration for for in loops. You will want an array, if your datatypes are to be sorted.

Upvotes: 2

Related Questions