簡體   English   中英

過濾嵌套對象並保留父母

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM