【问题标题】:How to search for a value in nested object and retrieve a parent value?如何在嵌套对象中搜索值并检索父值?
【发布时间】:2021-11-15 03:20:36
【问题描述】:

我有一组嵌套对象,其中一个看起来像这样(我压缩了整个对象,因为它太大了,jsonArr[0].data 是对象所在的位置):

var jsonArr =  {
"data": [{
  "id": 5201,
  "name": "Simple Engineering",
  "contracts": [{
    "id": 461,
    "contract_type_id": 99,
    "contract_status_id": null,
    "pivot": {
        "entity_id": 5201,
        "contract_id": 461
    },
    "projects": [{
        "id": 2785,
        "name": "Something Hydro",
        "pivot": {
            "contract_id": 461,
            "project_id": 2785
        }
     }]
   }]
 }]
}

我还有另一个值数组:

 var ids = [461,452,478,655]

我正在尝试找出一种方法将ids 中的值与data.contracts.id 中的值相匹配。如果一个值匹配,那么我想检索data.nameprojects.id

所以在这种情况下,结果将是一个如下所示的数组,因为只有 461 匹配:

 var names = ["Simple Engineering",2785]

我希望这是有道理的。当我正在处理一个由多个对象组成的数组时,我需要一种迭代每个 ids 值和每个数组对象的方法。谢谢,感谢您的帮助。

【问题讨论】:

  • 提供的数据结构已损坏 ...jsonArr 是一个对象,然后必须编写代码 ...const jsonArr = { "data": [ /* ... */ ] }; 或者它确实是一个数组,那么基本结构需要是喜欢...const jsonArr = [ { "data": [ /* ... */ ] }, { "data": [ /* ... */ ] } /* ,.. */ ];。对于 OP,实际处理的是哪种结构?
  • btw ... 没有像 JSON 数组或 JSON 对象这样的东西。 JSON 是一种基于字符串的数据交换格式。 OP 确实提供的是嵌套对象文字(语法)的无效尝试。
  • 3rd ... OP 是否在寻找通用方法?...原因来自提供的示例和 461 的匹配值不仅 contracts 项目的 id 匹配但 OP 还希望从 projects 项目的 pivot 匹配 contract_idprojects 项目自己的 id 不一定需要匹配。
  • @PeterSeliger 我已经编辑了我的示例数据。它应该是一个对象。
  • 很抱歉,但我不确定我理解您所说的通用方法是什么意思?

标签: javascript arrays object iterator


【解决方案1】:

var jsonArr =  {
"data": [{
  "id": 5201,
  "name": "Simple Engineering",
  "contracts": [{
    "id": 461,
    "contract_type_id": 99,
    "contract_status_id": null,
    "pivot": {
        "entity_id": 5201,
        "contract_id": 461
    },
    "projects": [{
        "id": 2785,
        "name": "Something Hydro",
        "pivot": {
            "contract_id": 461,
            "project_id": 2785
        }
     }]
   }]
 }]
}
var ids = [461,452,478,655]
var names=[]
var matched = jsonArr.data?.map(d=>d?.contracts?.map(con=>con?.projects?.map(proj=>{
   if(proj?.pivot?.contract_id===ids.find(id=>id===proj?.pivot?.contract_id))
   {
    names.push(d?.name)
    names.push(proj?.pivot?.project_id)
   }     
})))
console.log(names)
var names=[]
var matched = jsonArr.map(jArr=>jArr?.data?.map(d=>d?.contracts?.map(con=>con?.projects?.map(proj=>{
   if(proj?.pivot?.contract_id===ids.find(id=>id===proj?.pivot?.contract_id))
   {
    names.push(d?.name)
    names.push(proj?.pivot?.project_id)
   }     
}))))
console.log(names)

【讨论】:

  • 欢迎来到 StackOverflow!请考虑修改您的答案,以添加有关此代码中发生的情况的说明,以便提问者和未来的读者都能理解上下文。
  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-30
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多