我在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
但是如何对对象进行处理呢?
如果你想一次迭代整个对象,你可以使用for in循环:
for (var i in obj) {
...
}
但如果你想把物体分成几部分实际上你做不到。不能保证对象中的属性按任何指定的顺序排列。因此,我可以想到两种解决方案。
首先是“删除”已经读取的属性:
var i = 0;
for (var key in obj) {
console.log(obj[key]);
delete obj[key];
if ( ++i > 300) break;
}
我能想到的另一个解决方案是使用数组的数组而不是对象:
var obj = [['key1', 'value1'], ['key2', 'value2']];
然后,标准for循环将工作。
唯一可靠的方法是将对象数据保存到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+。
我最终想出了一个方便的实用工具函数,具有统一的接口来迭代对象,字符串,数组,TypedArrays, Maps, Sets,(任何Iterables)。
const iterate = require('@a-z/iterate-it');
const obj = { a: 1, b: 2, c: 3 };
iterate(obj, (value, key) => console.log(key, value));
// a 1
// b 2
// c 3
https://github.com/alrik/iterate-javascript