【问题标题】:How can I access a value in a multidimensional object with unique keys in Javascript?如何使用 Javascript 中的唯一键访问多维对象中的值?
【发布时间】:2016-05-10 05:41:05
【问题描述】:

如何访问下面对象中name 的值?此外,由于唯一键(即friend1friend2)包含其他键/值对,因此该对象是否具有特殊名称?

    var friends = {
        "friend1":{
            "name":"ana",
            "position":1,
            "spouse":"billy"
        },
        "friend2":{
            'name':'keri',
            'position':2,
            'spouse':'david'
        }
    };

请注意,这是我正在进行的项目的简化版本。我意识到有一种更好的方法来保存朋友列表的数据——要记住的一点是,保存其他键/值对的键是唯一的。

我已经尝试过了,但它显然不起作用(即“未定义”):

for( i = 0; i < Object.keys(friends).length; i++ ) {
  var theFriend = [i].name;
  alert(theFriend);
}

这是fiddle

【问题讨论】:

  • 大多数时候,如果你看到这样的结构,你就做错了......
  • @Alnitak 感谢您解决这个问题。我自己并没有看到这种格式,但我在jsfiddle.net/mitchmalone/Wf6qy/1 遇到了一个小提琴,它根据中心位置计算距离,我使用他的代码构建了一个在谷歌地图上放置多个标记的项目。可能还有另一种方法,但再次感谢您的评论。
  • @Alnitak,我注意到了你的编辑。谢谢你。那么变量friends只是一个对象,和JSON无关?我见过其他类似的代码,人们称之为 JSON,但我想肯定有一些区别。
  • JSON 是一种对象序列化格式,即你得到一个看起来有点像 JS 对象字面量的字符串(并且确实是可解析的)。至于你给出的另一个例子,那 is 是一个合适的用途,因为键是真正唯一的(而你的似乎没有语义值),并且没有有点像它的 position 元素应该只是一个数组偏移量。

标签: javascript object


【解决方案1】:

尝试关注

var keys = Object.keys(friends);
for( i = 0; i < keys.length; i++ ) {
  var theFriend = friends[keys[i]].name;
  alert(theFriend);
}

供参考 - https://jsfiddle.net/mu7jaL4h/7/

【讨论】:

  • 非常感谢您如此迅速地回复。这行得通,但 Aba 的代码行数更少。不过,再次感谢您。我仍在学习这一点,因此看到解决同一问题的多个解决方案非常有帮助。
【解决方案2】:
`[i]` 

您刚刚创建了一个新数组并将i 的值放入其中。

您需要告诉 JavaScript 您正在访问哪个对象的 i 属性。

friends[Object.keys(friends)[i]].name

【讨论】:

  • 哦,是的,您需要使用i 的值来获取keys 数组的值,然后将其用作friends 对象的属性名称。
  • @Quentin,感谢您澄清您的原始答案。现在可以了。
  • @Quentin 说真的,你已经把Object.keys(friends)[i] 放入循环中,使得每次迭代两次调用Object.keys?!
【解决方案3】:
for(index in friends ) {
  var theFriend =friends[index].name;
  alert(theFriend);
}

请大师:https://jsfiddle.net/rwoukdpf/

【讨论】:

  • 我会赞成你使用for .. in,这实际上是正确的方法,但你会因为狂妄而失去一个
  • @Aba,感谢您如此快速的响应和非常干净的代码。我完全赞成狂妄自大哈哈。
  • @Alnitak 实际上只是想搞笑,小提琴 = 音乐 = 大师,如果给人的印象很自负,我很抱歉。
【解决方案4】:

在 ES5 中,使用:

for (var index in friends) {     // NB: index and name have function scope
    var name = friends[index].name;
}

在 ES6 中,使用:

for (let friend of friends) {    // NB: 'of', not 'in'
    let name = friend.name;
}

如果您必须使用普通的for 循环,请确保您的循环不变量在每次迭代中都不会被计算:

var keys = Object.keys(friends);
for (var i = 0, n = keys.length; i < n; ++i) {
    var name = friends[i].name;
}

尽管如此,建议使用此循环 - 使用 for .. in 的单次传递对象比创建一个键数组然后遍历它更便宜。 ES6 for .. of 更好。

【讨论】:

  • 非常感谢您提供如此详尽的解释。我真的很感激。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
相关资源
最近更新 更多