【问题标题】:How to get the right property of a nested object property in a for...in?如何在 for...in 中获取嵌套对象属性的正确属性?
【发布时间】:2019-08-08 14:28:12
【问题描述】:

给定以下 sn-p:

let PARENT = {
  CHILD_1: {
    no: '1',
    page: 3,
    toString: function(){ return this.no; } },
  CHILD_2: {
    no: '2',
    page: 4,
    toString: function(){ return this.no; } },
}
console.log( JSON.stringify(PARENT, null, 1) )

for ( let c in PARENT ) {
  // c is a CHILD_n object here, right?

  console.log(c)  // why 'CHILD_n' instead of 'no' from toString()?
  console.log(c.page)  // why undefined instead of 'page'?
}

我没有得到预期的结果:

  1. 为什么c 解析为CHILD_n 属性的名称而不是toString() 返回的值?
  2. 为什么是c.page undefined? 1. c 不是一个CHILD_n 对象,它的属性可用吗?
  3. 如何获得期望值?

【问题讨论】:

  • for ... in 循环遍历 keys,for ... of 循环遍历属性 values。
  • 另外,Object.entries() 给出了一个包含[key, value] 条目的二维数组。
  • @Pointy 所以,for...in 将对象视为key:value 对的数组,对吧?如果是,这是否像PARENT[0][0] 或PARENT['CHILD_1']['no'] 这样的传递产生'1'?

标签: javascript object properties nested for-in-loop


【解决方案1】:

如 cmets 中所述,for... in 循环通过键;即字符串 'CHILD_1' 和 'CHILD_2' 而不是对象。

for... of 迭代值,但是,您不能直接迭代对象,因为对象是不可迭代的。 for (value of {}) {} 会抛出错误。

相反,您必须通过例如获取可迭代的值列表。 Object.values 在使用 for... of 进行迭代之前。

最后,toString 不会被console.log 自动调用,因此您必须显式调用它。

let PARENT = {
  CHILD_1: {
    no: '1',
    page: 3,
    toString: function(){ return this.no; } },
  CHILD_2: {
    no: '2',
    page: 4,
    toString: function(){ return this.no; } },
};

for ( let c of Object.values(PARENT) ) {
  console.log(c);
  console.log(c.toString());
  console.log(c.page);
}

【讨论】:

  • 感谢您的回答。你的第二段完全符合我在第一条评论后得到的结果:TypeError: PARENT is not iterable。既然你澄清了这一点,它就可以工作了。
  • @GeroldBroser 是的,对评论及其含义感到抱歉;我在我的世界里不使用任何一种for 形式,所以我只有“学术”准知识:)
  • Re p.4:是的,我忘记了 String 的上下文 toString() 就像 `${c}`。这就是我在这里真正用来避免+ 连接和更长的打字/阅读时间。
  • 好的,现在.log(c) 打印对象,但.log(`c=${c}`) 打印c=1 | c=2,当然。现在如何打印带有前导字符串的对象,除了.log("c=", c)?
  • 不要覆盖 toString?
猜你喜欢
  • 2011-09-17
  • 2018-02-06
  • 2016-02-14
  • 1970-01-01
  • 1970-01-01
  • 2011-10-17
  • 1970-01-01
  • 2021-03-08
  • 1970-01-01
相关资源
最近更新 更多