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