变量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如何表示对象的财产?它不是内置方法或属性。为什么它会产生对象中的每个属性?
当前回答
在这里,我迭代每个节点并创建有意义的节点名称。如果您注意到,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)的回答的启发。但此解决方案具有更好的性能和更少的模糊性
其他回答
let obj = {"a": 3, "b": 2, "6": "a"}
Object.keys(obj).forEach((item) => {console.log("item", obj[item])})
// a
// 3
// 2
jquery允许您立即执行以下操作:
$.each( obj, function( key, value ) {
alert( key + ": " + value );
});
这是为了。。。in语句(MDN、ECMAScript规范)。
您可以将其读为“对于obj对象中的每个属性,依次将每个属性分配给PROPT变量”。
实现这一点的简单明了的方法,即不迭代原型的现代JS,如下所示:
Object.prototype.iterateProperties = ((callback) => {
Object.keys(obj).filter(key => obj.hasOwnProperty(key)).forEach((key) => {
callback(key, obj[key]);
});
});
解释
这段代码在所有对象的原型中创建了一个可以在每个object实例中访问的函数。该函数迭代对象的所有自己的财产,并运行回调函数,该函数为对象中的每个属性获取(键、值)。
使用示例
obj.iterateProperties((key, value) => console.log(key + ': ' + value));
如果您的环境支持ES2017,那么我将推荐Object.entries:
Object.entries(obj).forEach(([key, value]) => {
console.log(`${key} ${value}`);
});
如Mozillas Object.entries()文档所示:
Object.entries()方法返回给定对象自身的数组可枚举属性[key,value]对,顺序与由…提供。。。in循环(区别在于for in循环还列举了原型链中的财产)。
基本上,使用Object.entries,我们可以放弃旧的for。。。循环中:
// This step is not necessary with Object.entries
if (object.hasOwnProperty(property)) {
// do stuff
}