变量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如何表示对象的财产?它不是内置方法或属性。为什么它会产生对象中的每个属性?
当前回答
现在,只需添加Symbol.iterator方法,就可以将标准JS对象转换为可迭代对象。然后可以使用for循环并直接访问其值,甚至可以在对象上使用扩展运算符。凉的让我们看看如何做到:
var o={a:1,b:2,c:3},a=[];o[Symbol.iiterator]=函数*(){var ok=对象.keys(this);i=0;而(i<ok长度)产生这个[ok[i++]];};for(o的var值)console.log(value);//或者你甚至可以这样做a=[…o];控制台日志(a);
其他回答
实现这一点的简单明了的方法,即不迭代原型的现代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));
如果您只想迭代映射属性值,则lodash具有_.mapValues
常量对象={a: 2,b: 3个}常量res=_.map值(obj,v=>v*2)console.log(res)<script src=“https://cdn.jsdelivr.net/npm/lodash@4.17.21/lodash.min.js“></script>
迭代财产需要额外的hasOwnProperty检查:
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
// do stuff
}
}
这是必要的,因为对象的原型包含对象的附加财产,这些属性在技术上是对象的一部分。这些附加的财产继承自基本对象类,但仍然是obj的财产。
hasOwnProperty只是检查这是否是该类特有的属性,而不是从基类继承的属性。
也可以通过对象本身调用hasOwnProperty:
if (obj.hasOwnProperty(prop)) {
// do stuff
}
但如果对象具有同名的不相关字段,则此操作将失败:
var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo'); // TypeError: hasOwnProperty is not a function
这就是为什么通过Object.prototype调用它更安全的原因:
var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo'); // true
JavaScript中的对象是财产的集合,因此可以在for-each语句中循环。
您应该将obj视为键值集合。
jquery允许您立即执行以下操作:
$.each( obj, function( key, value ) {
alert( key + ": " + value );
});