变量obj={name:“西蒙”,年龄:“20”,服装:{style:“简单”,嬉皮士:假}}for(obj中的var propt){console.log(propt+':'+obj[propt]);}
变量propt如何表示对象的财产?它不是内置方法或属性。为什么它会产生对象中的每个属性?
变量obj={name:“西蒙”,年龄:“20”,服装:{style:“简单”,嬉皮士:假}}for(obj中的var propt){console.log(propt+':'+obj[propt]);}
变量propt如何表示对象的财产?它不是内置方法或属性。为什么它会产生对象中的每个属性?
当前回答
添加ES2015对Reflect.ownKeys(obj)的使用,并通过迭代器迭代财产。
例如:
let obj = { a: 'Carrot', b: 'Potato', Car: { doors: 4 } };
可以通过
// logs each key
Reflect.ownKeys(obj).forEach(key => console.log(key));
如果您想直接迭代对象的键的值,可以定义迭代器,就像JavaScipts的字符串、数组、类型化数组、Map和Set的默认迭代器一样。
JS将尝试通过默认迭代器属性进行迭代,该属性必须定义为Symbol.iterator。
如果希望能够遍历所有对象,可以将其添加为Object的原型:
Object.prototype[Symbol.iterator] = function*() {
for(p of Reflect.ownKeys(this)){ yield this[p]; }
}
这将使您能够使用for。。。例如:
for(val of obj) { console.log('Value is:' + val ) }
注意:截至撰写此答案(2018年6月),除IE外,所有其他浏览器都支持生成器和。。。通过Symbol.iterator迭代
其他回答
从JavaScript 1.8.5开始,您可以使用Object.keys(obj)获取在对象本身上定义的财产数组(obj.hasOwnProperty(key)返回true的属性)。
Object.keys(obj).forEach(function(key,index) {
// key: the name of the object key
// index: the ordinal position of the key within the object
});
这比使用for in循环更好(更可读)。
这些浏览器支持:
Firefox(壁虎):4(2.0)铬:5Internet Explorer:9
有关更多信息,请参阅Mozilla Developer Network Object.keys()的参考。
Object.keys(obj).forEach(key =>
console.log(`key=${key} value=${obj[key]}`)
);
在这里,我迭代每个节点并创建有意义的节点名称。如果您注意到,instanceOfArray和instanceOfObject几乎做了相同的事情(在我的应用程序中,我给出了不同的逻辑)
function iterate(obj,parent_node) {
parent_node = parent_node || '';
for (var property in obj) {
if (obj.hasOwnProperty(property)) {
var node = parent_node + "/" + property;
if(obj[property] instanceof Array) {
//console.log('array: ' + node + ":" + obj[property]);
iterate(obj[property],node)
} else if(obj[property] instanceof Object){
//console.log('Object: ' + node + ":" + obj[property]);
iterate(obj[property],node)
}
else {
console.log(node + ":" + obj[property]);
}
}
}
}
注:我受到了翁德雷·斯文达尔(Ondrej Svejdar)的回答的启发。但此解决方案具有更好的性能和更少的模糊性
Dominik的回答很完美,我更喜欢这样做,因为读起来更干净:
for (var property in obj) {
if (!obj.hasOwnProperty(property)) continue;
// Do stuff...
}
JavaScript中的对象是财产的集合,因此可以在for-each语句中循环。
您应该将obj视为键值集合。