javascript - 如何在 for...in 中获取嵌套对象属性的正确属性?

标签 javascript object properties nested for-in-loop

给出以下代码片段:

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未定义? 1. c 不是一个具有可用属性的 CHILD_n 对象吗?
  3. 如何获得期望值?

最佳答案

正如评论中提到的,for...in 循环遍历按键;即字符串 'CHILD_1''CHILD_2' 而不是对象。

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

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

最后,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);
}

关于javascript - 如何在 for...in 中获取嵌套对象属性的正确属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57414928/

相关文章:

javascript - 为什么我只得到 2 和 3 为假? (如果数字是素数则返回真)

Javascript Lodash 语法错误

javascript - 将 jQuery 插件插入 MEAN.js 代码库的位置

javascript - 循环一个变量的items(list),每个item也是一个带items(list)的变量

java - 在同一包中查找属性文件时,class.getResourceAsStream 返回 null

c# - 如何在 C# 中将属性设置为默认值?

javascript - 获取所选文本的 xpath

javascript - 为什么 jQuery 的 .data 方法会这样? (可能的错误?)

Javascript:TypeError:...不是构造函数

properties - 在 Gradle 构建脚本中访问 Teamcity 构建号