Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/479.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过深层嵌套对象中的特定键查找对象| Javascript_Javascript_Arrays_Function_Object_Ecmascript 6 - Fatal编程技术网

通过深层嵌套对象中的特定键查找对象| Javascript

通过深层嵌套对象中的特定键查找对象| Javascript,javascript,arrays,function,object,ecmascript-6,Javascript,Arrays,Function,Object,Ecmascript 6,如果我不知道我的对象中有多少嵌套对象,那么根据id查找对象并返回该对象的最干净方法是什么 假设我有以下结构: myObj = { "id": "5e6b8961ba08180001a10bb6", "children": [ { "id": "5e6b8961ba08180001a10bb7", "refrenceId": "SEC-

如果我不知道我的对象中有多少嵌套对象,那么根据id查找对象并返回该对象的最干净方法是什么

假设我有以下结构:

  myObj = {
              "id": "5e6b8961ba08180001a10bb6",
              "children": [
                {
                  "id": "5e6b8961ba08180001a10bb7",
                  "refrenceId": "SEC-02986",
                  "children": [
                    {
                      "id": "5e58d7bc1bbc71000118c0dc"
                    },
                    {
                      "id": "5e58d7bc1bbc71000118c0dd",
                      "refrenceId": "SKU-00343"
                     },
                    {
                      "id": "5e590d571bbc71000118c102",
                      "refrenceId": "SKU-05290"
                    },
                    {
                      "id": "5e590df71bbc71000118c109",
                      "children": [
                        {
                          "id": "5e590df71bbc71000118c10a"
                        },
                        {
                          "id": "5e590df71bbc71000118c10b",
                          "refrenceId": "SKU-00444"
                    },
                    {
                      "id": "5e5cb9428ae591000177c0f6"
                    }
                  ]
                },
                {
                  "id": "5e81899f0bab450001dcfc1d",
                  "refrenceId": "SEC-03260"
                },
                {
                  "id": "5e81c4b51503860001f97f6c",
                  "refrenceId": "SEC-03267",
                  "children": [
                    {
                      "id": "5e8ad5175d374200014edb3a",
                      "refrenceId": "SEC-03409",
                      "children": [
                        {
                          "id": "5e8f28882d94c1000156bebe"
                        }
                      ]
                    },
                    {
                      "id": "5e8ad5175d374200014edb3c",
                       "refrenceId": "SEC-03410"
                    },
                    {
                      "id": "5e8f29082d94c1000156bec6",
                      "refrenceId": "SEC-03495"
                    }
                  ]
                }
              ]
            }
假设,我想找到id为“5e590df71bbc71000118c10b”的对象,并从嵌套对象返回该对象

我已尝试使用以下代码:

   function nodeHasChildren(children, id) {

    for (const child of children) {

      if (child.id === id) {

        if (Array.isArray(child.children) && child.children.length > 0) {
          return child;
        }
      }
      else {
          const result = nodeHasChildren(child.children, id);

        if (result !== undefined) {
          return result
        }
      }
    }
  }
日志(nodeWithIdHasChildren(myObj,“5e590df71bbc71000118c10b”)

使用简单递归

function findDeepById(node, id) {
  if (node.id === id) return node;
  if (node.children) {
    for(const child of node.children){
      const match = findDeepById(child, id);
      if (match) return match;
    }
  }
}

const myObj={
“id”:“5e6b8961ba08180001a10bb6”,
“儿童”:[{
“id”:“5e6b8961ba08180001a10bb7”,
“引用ID”:“SEC-02986”,
“儿童”:[{
“id”:“5e58d7bc1bbc71000118c0dc”
},
{
“id”:“5e58d7bc1bbc71000118c0dd”,
“引用ID”:“SKU-00343”
},
{
“id”:“5e590d571bbc71000118c102”,
“引用ID”:“SKU-05290”
},
{
“id”:“5e590df71bbc71000118c109”,
“儿童”:[{
“id”:“5e590df71bbc71000118c10a”
},
{
“id”:“5e590df71bbc71000118c10b”,
“引用ID”:“SKU-00444”
},
{
“id”:“5e5cb9428ae591000177c0f6”
}
]
},
{
“id”:“5e81899f0bab450001dcfc1d”,
“引用ID”:“SEC-03260”
},
{
“id”:“5e81c4b51503860001f97f6c”,
“引用ID”:“SEC-03267”,
“儿童”:[{
“id”:“5e8ad5175d374200014edb3a”,
“引用ID”:“SEC-03409”,
“儿童”:[{
“id”:“5e8f28882d94c1000156bebe”
}]
},
{
“id”:“5e8ad5175d374200014edb3c”,
“引用ID”:“SEC-03410”
},
{
“id”:“5e8f29082d94c1000156bec6”,
“参考ID”:“SEC-03495”
}
]
}
]
}]
};
函数findDepById(节点,id){
if(node.id==id)返回节点;
if(节点子节点){
for(node.children的常量子节点){
const match=findDeepById(子,id);
如果(匹配)返回匹配;
}
}
}

日志(findDeepById(myObj,“5e590df71bbc71000118c10b”)简而言之,这部分是最大的问题:

if (child.id === id) {

    if (Array.isArray(child.children) && child.children.length > 0) {
      return child;
    }
  }
你找到了你的东西,为什么要找它的孩子


原始答复/工作解决方案 首先,您需要将原始对象设置为可移植对象,因为这是您的函数所期望的,我只需在调用函数时将其设置为类似于
nodehashchildren([myObj],…
)的数组即可。然后,在清理和修复上述逻辑之后,我们得到了以下结果(在下面的代码中添加了相关注释):

myObj={
“id”:“5e6b8961ba08180001a10bb6”,
“儿童”:[{
“id”:“5e6b8961ba08180001a10bb7”,
“引用ID”:“SEC-02986”,
“儿童”:[{
“id”:“5e58d7bc1bbc71000118c0dc”
},
{
“id”:“5e58d7bc1bbc71000118c0dd”,
“引用ID”:“SKU-00343”
},
{
“id”:“5e590d571bbc71000118c102”,
“引用ID”:“SKU-05290”
},
{
“id”:“5e590df71bbc71000118c109”,
“儿童”:[{
“id”:“5e590df71bbc71000118c10a”
},
{
“id”:“5e590df71bbc71000118c10b”,
“引用ID”:“SKU-00444”
},
{
“id”:“5e5cb9428ae591000177c0f6”
}
]
},
{
“id”:“5e81899f0bab450001dcfc1d”,
“引用ID”:“SEC-03260”
},
{
“id”:“5e81c4b51503860001f97f6c”,
“引用ID”:“SEC-03267”,
“儿童”:[{
“id”:“5e8ad5175d374200014edb3a”,
“引用ID”:“SEC-03409”,
“儿童”:[{
“id”:“5e8f28882d94c1000156bebe”
}]
},
{
“id”:“5e8ad5175d374200014edb3c”,
“引用ID”:“SEC-03410”
},
{
“id”:“5e8f29082d94c1000156bec6”,
“参考ID”:“SEC-03495”
}
]
}
]
}]
}
函数节点归属子节点(子节点,id){
for(const child of children){
如果(child.id==id){
//找到解决方案,无需执行任何其他操作
console.log(“解决方案:”);
返回儿童;
}否则{
//检查它是否有子对象,并递归地迭代它们
if(Array.isArray(child.children)和&child.children.length>0)
var result=nodeHasChildren(child.children,id);
//检查是否在上面一行中的儿童中找到结果
如果(结果!=未定义)
返回结果;
}
}
}
日志(节点子节点([myObj],“5e590df71bbc71000118c10b”);
console.log(nodehashchildren([myObj],“5e8ad5175d37420014edb3c”);
我们现在使用它来完成简单的数据处理任务。只要你仔细思考一下,它就会非常棒。下面是你如何回答问题的

//const objectScan=require('object-scan');
const find=(id,input)=>objectScan(['**']{
rtn:'值',
中止:对,
filterFn:({value})=>value.id==id
})(输入);
const myObj={id:'5e6b8961ba08180001a10bb6',子项:[{id:'5e6b8961ba08180001a10bb7',引用id:'SEC-02986',子项:[{id:'5e58d7bc1bbc71000118c0dc',id:'5e58d7bc1bbc71000118c0dd',引用id:'SKU-00343',id:'5E590D571BBC7100118C102',引用id:'SKU-05290',子项:[id:'[{id:'5e590df71bbc71000118c10a'},{id:'5e590df71bbc71000118c10b',referenceID:'SKU-00444'},{id:'5e5cb9428ae591000177c0f6'},{id:'5e81899f0bab450001dcfc1d',referenceID:'SEC-03260'},{id:'5E81C4B5586001F97F6C',referenceID:'SEC-03267',子项:[{id:'E8AD51899F0BAB450001DCFC1D''SEC-039',子项:[{id:'5E8F28882D94C1000156BEBEBE'},{id:'5e8ad5175d374200014edb3c',referenceId:'SEC-03410'},{id:'5e8f29082d94c1000156bec6',referenceId:'SEC-03495'}};
日志(查找('5e8ad5175d374200014edb3a',myObj');
/* =>
{id:'5e