[英]Filter nested object and keep parents
我想通過屬性“名稱”的值搜索嵌套對象,結果將保留其所有父對象。
例如,
const object = [
{
name: 'Mary',
children: [
{
name: 'Jack',
},
{
name: 'Kevin',
children: [
{
name: 'Lisa',
}
]
}
]
},
{
name: 'Gina',
children: [
{
name: 'Jack',
}
]
}
]
如果我搜索“瑪麗”,則應返回:
[
{
name: 'Mary',
}
]
如果我搜索“傑克”,則應返回:
[
{
name: 'Mary',
children: [
{
name: 'Jack',
}
]
},
{
name: 'Gina',
children: [
{
name: 'Jack',
}
]
}
]
如果我搜索“ Lisa”,則應返回:
[
{
name: 'Mary',
children: [
{
name: 'Jack',
children: [
{
name: 'Lisa',
}
]
}
]
}
]
我嘗試了一些方法,但只能過濾兩層。 如下:
return object.filter(data => {
if (data.children) {
return data.name.includes(keyword) || data.children.find(item => item.name.includes(keyword));
}
return data.name.includes(keyword);
})
有人可以指出我正確的方向嗎? 謝謝!
您可以構建一個對象,如果嵌套,則檢查子對象並在必要時創建父對象。
function getObjects(array, target) { return array.reduce((r, { name, children = [] }) => { if (name === target) { r.push({ name }); return r; } children = getObjects(children, target); if (children.length) { r.push({ name, children }) } return r; }, []); } var data = [{ name: 'Mary', children: [{ name: 'Jack' }, { name: 'Kevin', children: [{ name: 'Lisa' }] }] }, { name: 'Gina', children: [{ name: 'Jack' }] }]; console.log(getObjects(data, 'Mary')); console.log(getObjects(data, 'Jack')); console.log(getObjects(data, 'Lisa'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
這是深度優先方法的示例:
function searchWithParents(tree, query) {
let results = [];
for (const {name, children} of tree) {
if (name === query) {
results.push({name});
}
if (children) {
const subtreeResults = searchWithParents(children, query);
const mappedResults = subtreeResults.map(child => ({name, children: [child]}))
results = results.concat(mappedResults);
}
}
return results;
}
console.log(searchWithParents(object, 'Mary'));
console.log(searchWithParents(object, 'Jack'));
console.log(searchWithParents(object, 'Lisa'));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.