【问题标题】:Better way of directly accessing JSON child object直接访问 JSON 子对象的更好方法
【发布时间】:2014-06-22 08:06:28
【问题描述】:

我有一个相当大的 JSON 响应,其结构与此类似:

{ "parent": [ { "id": 1000, "name": "Example", "child": [ { "id": 2000, "name": "Example" } ] } ] }

我需要访问child 的数据,我知道parentchild's id。循环遍历两者似乎有点过头了。理想情况下,我可以访问数据

parent[id:1000].child[id:2000];

如何在不遍历所有父子对象的情况下访问子对象?

另外,我设计了这个 JSON 对象,并欢迎任何关于改进它的结构的建议,因为我正在努力完成。

我有过的最接近的解决方案如下,但看起来很糟糕:

{ 1000: [ { "name": "Parent", 2000: [ { "name": "Child" } ] } ] }

【问题讨论】:

  • 数字不能作为 json 对象的键。我会使用 Array.prototype.filter 方法。可能创建一个通用函数来按 id 过滤(在咖啡脚本中会很琐碎和简短,在 JS 中会更冗长)
  • 您的最后一个解决方案是可以的,只是您需要将数字转换为字符串:即 { "1000": { "name": "parent", "2000": { "name": "child" }, "2001":{ "name": "child+1" }// 以此类推
  • 关于 JSON 的一个罕见的好问题!
  • @AlexanderM 是的,只是“OK”,对吧?得到你关于数字到字符串的注释。谢谢。

标签: javascript arrays json loops object


【解决方案1】:

过滤器可以是:

parent.filter(function(item) {
    return item.id == 1000
})[0].child.filter(function(item) {
    return item.id == 2000
})[0]

你也可以定义一个函数来按id过滤:

byId = function(id) { return function(item) { return item.id == id} }

然后

parent.filter(byId(1000))[0].child.filter(byId(2000))[0];

你也可以定义一个更通用的过滤函数:

by = function(key, value) { return function(item) { return item[key] == value} }

parent.filter(by('id', 1000))[0].child.filter(by('id', 2000))[0];

【讨论】:

  • 我想知道“过度杀伤”是什么主题启动器。如果他谈论性能,那么这个解决方案将比嵌套的更慢。
  • @AlexanderM by overkill 我想我的意思是完成所需的开销和代码量
  • @njzk2 我很欣赏这个答案,但在尝试这个之前我会先循环一下。
  • @ggwarpig :当filter 满足您的需求时,我看不到循环的意义。
  • @njzk2 让您的代码在这里工作jsfiddle.net/MBP3q 但是当我尝试在我的代码中实现它时,不断收到“未捕获的类型错误”无法读取未定义的属性“过滤器”。这是否意味着它认为过滤器是键的名称?还在玩这个...
猜你喜欢
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2018-01-30
相关资源
最近更新 更多