最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Iterate an object on a specific order - Stack Overflow

programmeradmin0浏览0评论

I have some JSON like this:

{ 
"a": { "text": "text", "index": 5 },
"b": { "text": "text", "index": 3 },
"c": { "text": "text", "index": 1 },
} 

Now I need to interate this object and call a function on every property of the first level (a, b and c), but I have to do it on order using the "index" property, like "c" first, then "b" and last "a".

However I read that I shouldn't use a for in loop:

A for...in loop iterates over the properties of an object in an arbitrary order (see the delete operator for more on why one cannot depend on the seeming orderliness of iteration, at least in a cross-browser setting).

then how I can do this?

Thanks

I have some JSON like this:

{ 
"a": { "text": "text", "index": 5 },
"b": { "text": "text", "index": 3 },
"c": { "text": "text", "index": 1 },
} 

Now I need to interate this object and call a function on every property of the first level (a, b and c), but I have to do it on order using the "index" property, like "c" first, then "b" and last "a".

However I read that I shouldn't use a for in loop:

A for...in loop iterates over the properties of an object in an arbitrary order (see the delete operator for more on why one cannot depend on the seeming orderliness of iteration, at least in a cross-browser setting).

then how I can do this?

Thanks

Share Improve this question edited Mar 20, 2018 at 4:16 David Rivera asked Mar 20, 2018 at 4:07 David RiveraDavid Rivera 3691 gold badge5 silver badges12 bronze badges 3
  • Can you make a copy, sort it and then operate on it? Or you're hoping to do this without a copy? I can imagine doing it with a while loop, but that seems onerous... – Alexander Nied Commented Mar 20, 2018 at 4:13
  • Yes, I think making a copy would be acceptable – David Rivera Commented Mar 20, 2018 at 4:17
  • A copy would be a bit inelegant and unnecessary though - just use the native array methods. – CertainPerformance Commented Mar 20, 2018 at 4:21
Add a ment  | 

6 Answers 6

Reset to default 6

You could,

  1. Get the properties of the object as an array using Object.keys().
  2. Sort the properties of the object using sort().
  3. Use forEach() to iterate through the sorted items (which is executed in ascending order of the array).

var items = {
  "a": {
    "text": "text",
    "index": 5
  },
  "b": {
    "text": "text",
    "index": 3
  },
  "c": {
    "text": "text",
    "index": 1,
  }
};

Object.keys(items).sort(function(a, b) {
  return items[a].index - items[b].index;
}).forEach(doStuff);

function doStuff(key) {
  console.log(items[key]);
}

You can use getOwnPropertyNames

let obj = { 
  "a": { "text": "text", "index": 5 },
  "b": { "text": "text", "index": 3 },
  "c": { "text": "text", "index": 1 }
};

function test(p) { 
    console.log(p);
}

Object.getOwnPropertyNames(obj)
      .reverse() 
      .forEach(function(p){
         test(obj[p]);
      });

You can try the following:

  1. Covert the object to an array with elements in sorted order based on the index.
  2. Than simply forEach() on the sorted properties.

Sort function can be implemented as :

var obj = { 
"a": { "text": "text", "index": 5 },
"b": { "text": "text", "index": 3 },
"c": { "text": "text", "index": 1},
}

 function sortProperties(obj, sortedBy, isNumericSort, reverse) {
            sortedBy = sortedBy || 1; // by default first key
            isNumericSort = isNumericSort || false; // by default text sort
            reverse = reverse || false; // by default no reverse

            var reversed = (reverse) ? -1 : 1;

            var sortable = [];
            for (var key in obj) {
                if (obj.hasOwnProperty(key)) {
                    sortable.push([key, obj[key]]);
                }
            }
            if (isNumericSort)
                sortable.sort(function (a, b) {
                    return reversed * (a[1][sortedBy] - b[1][sortedBy]);
                });
            else
                sortable.sort(function (a, b) {
                    var x = a[1][sortedBy].toLowerCase(),
                        y = b[1][sortedBy].toLowerCase();
                    return x < y ? reversed * -1 : x > y ? reversed : 0;
                });
            return sortable; // array in format [ [ key1, val1 ], [ key2, val2 ], ... ]
        }
        
        sortProperties(obj, 'index', true, false);

The another solution is store the object keys and reverse it, then iterate with the object keys.

var obj = { 
	"a": { "text": "text", "index": 5 },
	"b": { "text": "text", "index": 3 },
	"c": { "text": "text", "index": 1 }
};
var yourFunction = console.log;
var keys = Object.keys(obj);
keys.reverse();
for (var i = 0; i < keys.length; i++) {
	yourFunction(obj[keys[i]]);
}

you can also make use of reverse() method of javascript if you want to access the json items in reverse order.
get the array of all the keys of json using Object.keys()
reverse the array using reverse() method
and finally you can make use of javascript forEach() method to work on the items of the json. Sample code is shown below

let obj = {
"a": { "text": "text", "index": 5 },
"b": { "text": "text", "index": 3 },
"c": { "text": "text", "index": 1 },
}

Object.keys(obj)
            .reverse()
            .forEach(ele => {
              console.log(obj[ele]);
            });

visit This link to know more about reverse() method

Probably you should use Object.keys to get a list of all the properties, sort that list, then iterate over it.

发布评论

评论列表(0)

  1. 暂无评论