簡體   English   中英

復雜分組:數組減少

[英]Complex Grouping : Array Reduce

我真的很糾結於 array.reduce(),我想在這種情況下我不確定我是否有正確的方法。 通常我有一個起始數組,我知道我最終需要得到什么,但我似乎無法正確分組。

這是起始數組

[
{ name: 'Home' },
{
    name: 'Services',
    menu: [
    { name: 'Painting' },
    { name: 'Decorating' },
    { name: 'Lawn mowing', submenu: 'Garden' },
    { name: 'Tree surgery', submenu: 'Garden' },
    { name: 'Edging', submenu: 'Garden' }
    ]
},
{ name: 'Contact' }
]

我想結束的是這個

[
{ name: 'Home' },
{
    name: 'Services',
    menu: [
    { name: 'Painting' },
    { name: 'Decorating' },
    {
        name: 'Garden',
        menu: [
        { name: 'Lawn mowing', submenu: 'Garden' },
        { name: 'Tree surgery', submenu: 'Garden' },
        { name: 'Edging', submenu: 'Garden' }
        ]
    }
    ]
},
{ name: 'Contact' }
]

所以我希望能夠按任何具有子菜單的內容進行分組,然后返回一個新的排序數組。

嘗試以下遞歸方法:

 function reduce(array) { const result = []; // object to keep grouped submenus const grouped = {}; for (let i of array) { if (i.menu) { // if the current item has a nested menu we call reduce recursively result.push({ name: i.name, menu: reduce(i.menu) }); } else if (i.submenu) { // if it has a submenu we put it to the grouped object if (grouped[i.submenu]) { grouped[i.submenu].menu.push(i) } else { grouped[i.submenu] = { name: i.submenu, menu: [i] }; result.push(grouped[i.submenu]); } } else { // else we just copy it to the result array result.push(i); } } return result; } const array = [ { name: 'Home' }, { name: 'Services', menu: [ { name: 'Painting' }, { name: 'Decorating' }, { name: 'Lawn mowing', submenu: 'Garden' }, { name: 'Tree surgery', submenu: 'Garden' }, { name: 'Edging', submenu: 'Garden' } ] }, { name: 'Contact' } ]; console.log(reduce(array));

您可以通過查找子菜單來減少數組,並將其用於實際級別中的節點的搜索。

如果不只是添加一個新對象或一個帶有遞歸調用菜單的對象。

 function mapSubmenu(result, { name, menu, submenu }) { if (submenu) { var parent = result.find(({ name }) => name === submenu); if (!parent) result.push(parent = { name: submenu, menu: [] }); parent.menu.push({ name, submenu }); } else { result.push(menu ? { name, menu: menu.reduce(mapSubmenu, []) } : { name } ); } return result; } var data = [{ name: 'Home' }, { name: 'Services', menu: [{ name: 'Painting' }, { name: 'Decorating' }, { name: 'Lawn mowing', submenu: 'Garden' }, { name: 'Tree surgery', submenu: 'Garden' }, { name: 'Edging', submenu: 'Garden' }] }, { name: 'Contact' }], result = data.reduce(mapSubmenu, []); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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