【发布时间】:2021-02-20 08:32:09
【问题描述】:
我想搜索一个深度嵌套的对象数组并返回所有匹配对象的路径。我有问题的部分解决方案,但代码只返回第一个匹配对象的路径。请查看输入、预期输出和代码本身。我已在预期输出部分中注释了所需的逻辑。
提前致谢。请帮帮我。
输入数据
[
{
"label":"Home",
"key":"home",
"level":1,
"children":[
{
"label":"Indoor Furniture",
"key":"furniture",
"level":2,
"children":[
{
"label":"Chair",
"key":"chair",
"level":3
},
{
"label":"Table",
"key":"table",
"level":3
},
{
"label":"Lamp",
"key":"lamp",
"level":3
}
]
}
]
},
{
"label":"Outdoor",
"key":"outdoor",
"level":1,
"children":[
{
"label":"Outdoor Furniture",
"key":"furniture",
"level":2,
"children":[
{
"label":"Trampoline",
"key":"trampoline",
"level":3
},
{
"label":"Swing",
"key":"swing",
"level":3
},
{
"label":"Large sofa",
"key":"large sofa",
"level":3
},
{
"label":"Medium Sofa",
"key":"mediumSofa",
"level":3
},
{
"label":"Small Sofa Wooden",
"key":"smallSofaWooden",
"level":3
}
]
},
{
"label":"Games",
"key":"games",
"level":2,
"children":[
]
}
]
},
{
"label":"Refurbrished Items",
"key":"refurbrished items",
"level":1,
"children":[
]
},
{
"label":"Indoor",
"key":"indoor",
"level":1,
"children":[
{
"label":"Electicity",
"key":"electicity",
"level":2,
"children":[
]
},
{
"label":"Living Room Sofa",
"key":"livingRoomSofa",
"level":2,
"children":[
]
}
]
}
]
预期输出 - 如果搜索沙发
[
// Remove the entire object if label of the object itself or any of its children doesn't include sofa
{
"label":"Outdoor",
"key":"outdoor",
"level":1,
"children":[
{
"label":"Indoor Furniture",
"key":"indoorFurniture",
"level":2,
"children":[
// Remove unmatched siblings
{ `// Child node matched, hence return its path from root (Outdoor -> Indoor Furniture)`
"label":"Large sofa",
"key":"large sofa",
"level":3
},
{ // Child node matched, hence return its path from root (Outdoor -> Indoor Furniture) and all its children if any
"label":"Medium Sofa",
"key":"mediumSofa",
"level":3
},
{ // Child node matched, hence return its path from root (Outdoor -> Indoor Furniture) and all its children if any
"label":"Small Sofa Wooden",
"key":"smallSofaWooden",
"level":3
}
]
}
]
},
{
"label":"Indoor",
"key":"indoor",
"level":1,
"children":[
{ // Child node matched, hence return its path from root (Indoor) and all its children if any
"label":"Living Room Sofa",
"key":"livingRoomSofa",
"level":2,
"children":[
]
}
]
}
]
预期输出 - 如果搜索家具
[ // Remove the entire object if label of the object itself or any of its children doesn't include furniture
{
"label":"Home",
"key":"home",
"level":1,
"children":[
{ // Child node matched, hence return its path from root (Home) and all its children if any
"label":"Indoor Furniture",
"key":"indoorFurniture",
"level":2,
"children":[
{
"label":"Chair",
"key":"chair",
"level":3
},
{
"label":"Table",
"key":"table",
"level":3
},
{
"label":"Lamp",
"key":"lamp",
"level":3
}
]
}
]
},
{
"label":"Outdoor",
"key":"outdoor",
"level":1,
"children":[
{ // Child node matched, hence return its path from root (Outdoor) and all its children if any
"label":"Outdoor Furniture",
"key":"outdoorFurniture",
"level":2,
"children":[
{
"label":"Trampoline",
"key":"trampoline",
"level":3
},
{
"label":"Swing",
"key":"swing",
"level":3
},
{
"label":"Large sofa",
"key":"large sofa",
"level":3
},
{
"label":"Medium Sofa",
"key":"mediumSofa",
"level":3
},
{
"label":"Small Sofa Wooden",
"key":"smallSofaWooden",
"level":3
}
]
}
]
}
]
代码
function findChild(obj, condition) {
if (Object.entries(condition).every( ([k,v]) => (obj[k].toLowerCase()).includes(v.toLowerCase()))) {
return obj;
}
for (const child of obj.children || []) {
const found = findChild(child, condition);
// If found, then add this node to the ancestors of the result
if (found) return Object.assign({}, obj, { children: [found] });
}
}
var search = { label: 'sofa' };
console.log(findChild(input, search)); // It returns only the first matched item path, i would like to get all matched items path
【问题讨论】:
标签: javascript reactjs recursion data-structures nested