遍历对象属性

IT技术 javascript loops object
2020-12-13 16:26:15

var obj = {
    name: "Simon",
    age: "20",
    clothing: {
        style: "simple",
        hipster: false
    }
}

for(var propt in obj){
    console.log(propt + ': ' + obj[propt]);
}

变量如何propt表示对象的属性?它不是内置方法或属性。为什么它提出了对象中的每个属性?

6个回答

迭代属性需要这个额外的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
因为,Alex S,对象的原型包含对象的附加属性,这些属性在技术上是对象的一部分。它们是从基对象类继承的,但它们仍然是属性。hasOwnProperty 只是检查这是否是该类特有的属性,而不是从基类继承的属性。一个很好的解释:brianflove.com/2013/09/05/javascripts-hasownproperty-method
2021-02-07 16:26:15
@BT 根据Mozilla 文档:“如果您只想考虑附加到对象本身的属性,而不是它的原型,请使用 getOwnPropertyNames或执行 hasOwnProperty 检查(也可以使用 propertyIsEnumerable)。”
2021-02-08 16:26:15
缺少一项重要信息。property这里是一个字符串,应该被称为propertyName否则可能会给像我这样的 JS 新手造成困惑,即在if.
2021-02-23 16:26:15
打电话的目的究竟是什么object.hasOwnProperty()property具有任何value的事实不意味着它的 inobject吗?
2021-02-24 16:26:15
然而,我觉得我应该提到 Object.keys(obj) 现在是获取对象本身键的更好的解决方案。链接到 Mozilla 文档:developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
2021-03-08 16:26:15

从 JavaScript 1.8.5 开始,您可以使用Object.keys(obj)来获取在对象本身上定义的属性数组(为 返回 true 的属性obj.hasOwnProperty(key))。

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 循环更好(也更易读)。

它在这些浏览器上受支持:

  • 火狐(壁虎):4 (2.0)
  • 铬:5
  • Internet Explorer:9

有关更多信息,请参阅Mozilla 开发人员网络Object.keys()的参考

为什么这比 for-in 更具可读性?for candidate in candidateStatus...对我来说似乎可读
2021-02-11 16:26:15
2021-02-12 16:26:15
如果你需要对旧浏览器的支持,你可以使用这个polyfill
2021-02-13 16:26:15
@AJ_83 没有摆脱 forEach() 的好方法。在这种情况下使用 some() 并返回 true 以中断
2021-02-16 16:26:15
在支持此语言构造的环境中,此方法允许调用 Array.foreach: Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
2021-03-05 16:26:15

小伙子们,我们在 2019 年,我们没有那么多时间打字……所以让我们来做一个很酷的新奇幻 ECMAScript 2016:

Object.keys(obj).forEach(e => console.log(`key=${e}  value=${obj[e]}`));
如果有人不想重新构建这个单行代码以一次做不止一件事情e,我已经发布了这个要点。它基本上就像大多数哈希实现一样,并使用( (key) => (value) )代替{ key => value },但如果您之前没有处理过它,它可以帮助您更好地对其进行可视化:gist.github.com/the-nose-knows/9f06e745a56ff20519707433e28a4fa8
2021-02-07 16:26:15
它是一个 oneliner 并使用 map 而不是 forEach。并且对于某些人来说,console.log 语句可能很有趣。
2021-02-08 16:26:15
遗憾的是,这在obj=window.performance.memory:-/ Where 时for in不起作用。IEvar obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
2021-02-08 16:26:15
这与 Danny R 的回答有何不同?
2021-02-18 16:26:15
window.performance.memory仅由 chrome 支持并Object.keys(obj)返回一个空数组。这与.map.
2021-03-08 16:26:15

这是for...in statementMDNECMAScript 规范)。

你可以把它读作“ FOR每个属性INobj对象,每个属性分配给PROPT依次变量”。

同意@RightSaidFred,完全不涉及in运算符和for语句,for-in语句本身代表一个语法产生式:for ( LeftHandSideExpression in Expression ),for ( var VariableDeclarationNoIn in Expression )
2021-02-10 16:26:15
为什么将其标记为答案?它很可能是这个线程中最没有帮助的一个..
2021-02-18 16:26:15
最没有帮助的答案?取决于你认为 OP 在问什么;当我第一次阅读这个问题时,似乎对使用变量来检查对象属性的机制感到困惑,这个答案eloquent地解释了(尽管“for-in”用词不当)。这个问题:“为什么会拿出所有的财产”我看可能意味着OP一直在寻找hasOwnProperty,但不知道它,但我认为它更可能是OP想知道什么,并且错误地接受了正确的回答一个不同的问题。:-)
2021-03-06 16:26:15
奇怪的是,这个答案有这么多的赞成票,特别是因为这些流行的评论似乎与它相矛盾。
2021-03-07 16:26:15
非常感谢,我现在明白了。我正在敲我的头,翻阅书籍和谷歌。
2021-03-08 16:26:15

在 ES 的最新实现中,您可以使用Object.entries

for (const [key, value] of Object.entries(obj)) { }

或者

Object.entries(obj).forEach(([key, value]) => ...)

如果您只想迭代这些值,请使用 Object.values:

for (const value of Object.values(obj)) { }

或者

Object.values(obj).forEach(value => ...)
这是最好的答案,你应该使用 for (const [key, value] of Object.entries(obj)) { }
2021-02-12 16:26:15
如果您只关注属性的值,则第三个建议很好。惊人的!
2021-02-13 16:26:15
这将是最好的解决方案(object.entries...),但我不能使用它。当你想多次这样做并且你的框架不能支持它时,你可以使用这个页面上的 polyfill:developer.mozilla.org/nl/docs/Web/JavaScript/Reference/...
2021-02-19 16:26:15