【问题标题】:Accessing a javascript object within a for loop returns undefined [duplicate]在 for 循环中访问 javascript 对象返回未定义 [重复]
【发布时间】:2017-02-21 14:32:56
【问题描述】:

我正在尝试访问 for 循环中的嵌套 javascript 对象。第一级对象显示得很好,但第二级子对象显示为未定义。但是,如果我在循环之外执行此操作,对对象访问进行硬编码,它就可以正常工作。怎么回事?

这是我要访问的对象:

var groups = {
  "group1": {
    "sum": 25,
    "count": 5
  },
  "group3": {
    "sum": 5,
    "count": 5
  }
}

看看我的意思:https://jsfiddle.net/97o1jme2/

【问题讨论】:

  • 代码应该发布在这里

标签: javascript json object nested traversal


【解决方案1】:

你使用for ... in

for...in 语句以任意顺序迭代对象的可枚举属性。对于每个不同的属性,可以执行语句。

它给你一个带有对象键的变量,你正在迭代。

那么你需要对对象正确的access,而不是group["sum"],将键与groups一起使用。

groups[group]["sum"]
//^^^^^^^^^^^

groups[group].sum
//^^^^^^^^^^^

var groups = { group1: { sum: 25, count: 5 }, group3: { sum: 5, count: 5 } },
    group;

for (group in groups) {
  console.log("[Loop access] " + group + " - sum: " + groups[group].sum + " - count: " + groups[group].count);
}

【讨论】:

  • 谢谢,这就像一个魅力。我想了解为什么会这样。我会假设循环变量的类型是 Object,为什么它是 String?
  • 因为您正在迭代对象的键。
  • 那个for..in 不好 ...请改用for..of ...
  • @KarelG 你能解释一下为什么 for..in 不好吗?我面临着类似的问题,但找不到任何可阅读的内容
  • @AsmaRahimAliJafri for..of MDN 文档有 a section 关于它与 for..in 的区别。基本上,后者会遍历所有可枚举的属性,而前者不会。了解彼此之间的差异很重要。我考虑使用 for..in 作为特殊用例的声明。
【解决方案2】:

如果您在循环中执行console.log(group),您将看到在每次迭代中group 变量不是您想要的object,而是一个简单的字符串——groups 对象的key。然后,您将通过循环内的groups[group] 访问正确的对象。

编辑

为了确保您获得正确的结果,我建议您在每次迭代时在循环内执行一些验证

if ( groups.hasOwnProperty(group) ) {
    // perform operation
}

根据文档

hasOwnProperty() 方法返回一个布尔值,指示对象是否具有指定的属性。

【讨论】:

  • 我明白了,但我会假设循环变量的类型是 Object,为什么它是 String?
  • 因为它迭代给定对象的属性,所以它是这样实现的。
猜你喜欢
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-05
  • 1970-01-01
相关资源
最近更新 更多