如何迭代JavaScript对象?

我在JavaScript中有一个对象:

{ abc: '...', bca: '...', zzz: '...', xxx: '...', ccc: '...', // ... } 

我想用for循环来获得它的属性。 我想迭代它的一部分(不是所有的对象属性一次)。

用一个简单的数组,我可以用循环的标准来做到这一点:

 for (i = 0; i < 100; i++) { ... } // first part for (i = 100; i < 300; i++) { ... } // second for (i = 300; i < arr.length; i++) { ... } // last 

但如何与对象做到这一点?

对于大多数对象, for .. in

 for (var key in yourobject) { console.log(key, yourobject[key]); } 

要避免logginginheritance属性,请使用hasOwnProperty进行检查:

 for (var key in yourobject) { if (yourobject.hasOwnProperty(key)) { console.log(key, yourobject[key]); } } 

此MDN文档更一般地解释如何处理对象及其属性。

如果你想“分块”,最好的方法是提取数组中的密钥。 由于命令不能保证,这是正确的方法。 在现代浏览器中,您可以使用

 var keys = Object.keys(yourobject); 

为了更加兼容,你最好这样做:

  var keys = []; for (var key in yourobject) { if (yourobject.hasOwnProperty(key)) keys.push(key); } 

然后你可以通过索引迭代你的属性: yourobject[keys[i]]

 for (var i=300; i<keys.length && i<600; i++) { console.log(keys[i], yourobject[keys[i]]); } 

这是现代浏览器的另一个迭代解决scheme:

 Object.keys(obj).filter(function(k, i) { return i >= 100 && i < 300; }).forEach(function(k) { console.log(obj[k]); }); 

甚至更短:

 Object.keys(obj).forEach(function(k, i) { if (i >= 100 && i < 300) { console.log(obj[k]); } }); 

但是,您必须考虑JavaScript对象中的属性没有sorting,即没有顺序。

唯一可行的方法是将对象数据保存到2个数组,一个键和一个数据:

 var keys = []; var data = []; for (var key in obj) { if (obj.hasOwnProperty(key) { keys.push(key); data.push(obj[key]); // Not necessary, but cleaner, in my opinion. See the example below. } } 

然后,您可以像往常一样迭代数组:

 for(var i = 0; i < 100; i++){ console.log(keys[i], data[i]); //or console.log(keys[i], obj[keys[i]]); // harder to read, I think. } for(var i = 100; i < 300; i++){ console.log(keys[i], data[i]); } 

我没有使用Object.keys(obj) ,因为那是IE 9+。

借助新的ES6 / ES2015function,您不必再使用对象来迭代散列。 您可以使用地图 。 JavaScript地图保持按键的顺序,这意味着你可以遍历它们,而不必检查hasOwnProperty,这总是真正的黑客。

遍历地图:

 var myMap = new Map(); myMap.set(0, "zero"); myMap.set(1, "one"); for (var [key, value] of myMap) { console.log(key + " = " + value); } // Will show 2 logs; first with "0 = zero" and second with "1 = one" for (var key of myMap.keys()) { console.log(key); } // Will show 2 logs; first with "0" and second with "1" for (var value of myMap.values()) { console.log(value); } // Will show 2 logs; first with "zero" and second with "one" for (var [key, value] of myMap.entries()) { console.log(key + " = " + value); } // Will show 2 logs; first with "0 = zero" and second with "1 = one" 

或使用forEach:

 myMap.forEach(function(value, key) { console.log(key + " = " + value); }, myMap) // Will show 2 logs; first with "0 = zero" and second with "1 = one" 

如果你想一次迭代整个对象,你可以for in循环中使用:

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

但是如果你想把对象分成几部分,实际上你不能。 不能保证对象中的属性是以任何指定的顺序。 因此,我可以想到两个解决scheme。

首先是“删除”已经读取的属性:

 var i = 0; for (var key in obj) { console.log(obj[key]); delete obj[key]; if ( ++i > 300) break; } 

我能想到的另一个解决scheme是使用arrays而不是对象:

 var obj = [['key1', 'value1'], ['key2', 'value2']]; 

然后,标准for循环将起作用。

 var Dictionary = { If: { you: { can: '', make: '' }, sense: '' }, of: { the: { sentence: { it: '', worked: '' } } } }; function Iterate(obj) { for (prop in obj) { if (obj.hasOwnProperty(prop) && isNaN(prop)) { console.log(prop + ': ' + obj[prop]); Iterate(obj[prop]); } } } Iterate(Dictionary);