如何迭代包含对象的对象?

3

我的目标:

"hockey": {
    stats: {
        skaters: {
            regular: [
                {name: "stat1", key: "statkey1"}
                {name: "stat2", key: "statkey2"}
                {name: "stat3", key: "statkey3"}

            ]
        },
        goalies: {
            regular: [
                {name: "stat1", key: "statkey4"}
                {name: "stat2", key: "statkey5"}
                {name: "stat3", key: "statkey6"}
            ]
        }
    }
}

我的代码:

var stats = [];
var key = "";
for (position in sport.stats) {
    for (stat_group in position) {
        for (stat in stat_group) {
            key = stat.key;
            stats[key] = true;
        }
    }
}

我试图使用上述代码从sport.stats.position.stat_group中的每个对象中获取属性key。每种运动都有不同数量的位置和统计组,因此使用三重循环。我没有收到任何控制台错误,但它根本没有获取键,并且迭代器变量未评估为对象而是整数。

这是我想要得到的结果stats对象:

{
    "statkey1": true,
    "statkey2": true,
    "statkey3": true,
    ...
}

希望你们能够帮忙!谢谢!

这不是 for ... in 的工作方式,请参阅文档。此外,sport未定义,我只看到statssport.stats无关。我非常确定“如何迭代包含对象的数组”已经被问了十几次。 - ASDFGerte
另请参考:这里这里这里和其他无数相关问题。 - ASDFGerte
2个回答

4
JS的for...in循环遍历的是键(keys),而非值(values)。如果想要完全遍历一个对象,可以使用以下方式:
for (key in sports.stats) {
  var position = sports.stats[key];
  for (group_key in position) {
    var stat_group = position[group_key];
    for (stat_key in stat_group) {
      stat_group[stat_key] = true;
    }
  }
}

2

在 JavaScript 中,Object.keys() 方法会返回对象的键值(key),而不是对应的值。

根据你的逻辑,你想要实现的功能应该是:

var stats = {};
var key = "";
for (position in sport.stats) {
    for (stat_group in sport.stats[position]) {
        for (stat in sport.stats[position][stat_group]) {
            key = sport.stats[position][stat_group][stat].key;
            stats[key] = true;
        }
    }
}

谢谢!问题已解决。 - adunn
@adunn,您为什么取消了我的答案? - omri_saadon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接