我在JavaScript中有一个对象:
{
abc: '...',
bca: '...',
zzz: '...',
xxx: '...',
ccc: '...',
// ...
}
我想用一个for循环来获取它的属性。我想要迭代它的部分(不是所有的对象属性一次)。
对于一个简单的数组,我可以用一个标准的for循环来做:
for (i = 0; i < 100; i++) { ... } // first part
for (i = 100; i < 300; i++) { ... } // second
for (i = 300; i < arr.length; i++) { ... } // last
但是如何对对象进行处理呢?
唯一可靠的方法是将对象数据保存到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+。
对于迭代数组、字符串或对象的键,使用For ..:
for (let key in yourobject) {
console.log(key, yourobject[key]);
}
在ES6中,如果你同时需要键和值,那就这样做
for (let [key, value] of Object.entries(yourobject)) {
console.log(key, value);
}
为了避免记录继承的属性,检查hasOwnProperty:
for (let key in yourobject) {
if (yourobject.hasOwnProperty(key)) {
console.log(key, yourobject[key]);
}
}
如果你正在使用一个简单的对象(例如你自己用{}创建的对象)迭代键时,你不需要检查hasOwnProperty。
MDN文档更一般地解释了如何处理对象及其属性。
如果你想“大块”地执行,最好是在数组中提取键。由于订单不能保证,这是正确的方式。在现代浏览器中,您可以使用
let keys = Object.keys(yourobject);
为了更加兼容,你最好这样做:
let keys = [];
for (let key in yourobject) {
if (yourobject.hasOwnProperty(key)) keys.push(key);
}
然后你可以通过索引迭代你的属性:
for (let i=300; i < keys.length && i < 600; i++) {
console.log(keys[i], yourobject[keys[i]]);
}
你可以尝试使用lodash-一个现代的JavaScript实用程序库,提供模块化,性能和额外的js来快速对象迭代
var users = {
'fred': {
'user': 'fred',
'age': 40
},
'pebbles': {
'user': 'pebbles',
'age': 1
}
};
_.mapValues(users, function(o) {
return o.age;
});
// => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
// The `_.property` iteratee shorthand.
console.log(_.mapValues(users, 'age')); // returns age property & value
console.log(_.mapValues(users, 'user')); // returns user property & value
console.log(_.mapValues(users)); // returns all objects
// => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash-compat/3.10.2/lodash.js"></script>
有了新的ES6/ES2015特性,你不再需要使用对象来遍历散列。你可以使用地图。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"