javascript - 复杂分组 : Array Reduce

标签 javascript arrays 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));

关于javascript - 复杂分组 : Array Reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59792932/

相关文章:

javascript - 检测右键删除/剪切/复制tinymce

javascript - 点击后分页不显示结果

javascript - jQuery 而不是向左移动。它消失了。 slider

java - 如何在java中对双数组使用indexOf方法

无法弄清楚为什么 C 中的循环在第一个浮点值处停止

javascript - 如何使用_.reduce或原生reduce对对象进行求和和排序?

.net - RavenDB - MapReduce 复杂聚合

javascript - 将 MathJax 合并到 Weebly 网站上

javascript - 仅使用 ES5、多个 Object.key 和 .map 导航多维对象以匹配 key

hadoop - mapreduce wordcount 程序中的驱动程序未调用 reducer