我在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
但是如何对对象进行处理呢?
你可以尝试使用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>
对于对象迭代,我们通常使用For ..in循环。该结构将循环遍历所有可枚举属性,包括通过原型继承继承的属性。例如:
让obj = {
prop1:(1),
prop2: '
}
对于(let the in obj) {
console.log (el);
console.log (obj [ol]);
}
然而,for. in将遍历所有可枚举元素,这将不能将迭代分割成块。为此,我们可以使用内置的object .keys()函数来检索数组中对象的所有键。然后,我们可以将迭代分解为多个for循环,并使用keys数组访问属性。例如:
让obj = {
prop1: ' 1 ',
prop2: ' 2 ',
prop3:“3”,
prop4:“4”,
};
const keys = Object.keys(obj);
console.log(键);
对于(设I = 0;I < 2;我+ +){
console.log (obj[键[我]]);
}
For(令I = 2;I < 4;我+ +){
console.log (obj[键[我]]);
}
如果你有一个简单的对象,你可以使用下面的代码迭代它:
let myObj = {
美国广播公司(abc):“…”
bca:“……”
鼾声大作:“……”
xxx:“……”
ccc:“……”
/ /……
};
let objKeys = Object.keys(myObj);
//现在我们可以使用objKeys遍历myObj
for (item of objKeys) {
//这将打印密钥
console.log(关键:,项);
//这将打印出值
console.log(价值:,myObj[项目]);
}
如果你有一个嵌套对象,你可以使用下面的代码遍历它:
设b = {
一:{
答:1,
b: 2
c: 3
},
二:{
4,
b: 5
c: 6
},
三:{
7,
b: 8
c: 9
}
};
let myKeys = Object.keys(b);
for (item of myKeys) {
//打印密钥
console.log(“关键”,项目)
//打印值(这将是另一个对象)
console.log(“价值”,b[项目])
//打印嵌套值
console.log('嵌套值',b[item]['a'])
}
如果你有一个对象数组,你可以使用下面的代码遍历它:
令c = [
{
答:1,
b: 2
},
{
答:3,
b: 4
}
];
对于(c项){
//单独打印整个对象
console.log(“对象”,项目);
//打印对象内部的值
console.log(“价值”,项目[a]);
}
如果你想一次迭代整个对象,你可以使用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循环将工作。
实际上,PITA不是标准Javascript的一部分。
/**
* Iterates the keys and values of an object. Object.keys is used to extract the keys.
* @param object The object to iterate
* @param fn (value,key)=>{}
*/
function objectForEach(object, fn) {
Object.keys(object).forEach(key => {
fn(object[key],key, object)
})
}
注意:我将回调参数切换为(value,key),并添加了第三个对象以使API与其他API保持一致。
像这样使用它
const o = {a:1, b:true};
objectForEach(o, (value, key, obj)=>{
// do something
});