我真的很纠结 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/