我有一个像这样的数组(打算进行一级嵌套)
const names = [
[{
name: "John",
country: "USA"
}, {
name: "Mary",
country: "UK"
}], {
name: "Paul",
country: "USA"
}
]
我想将其转换为
const groupBy = [{
country: "USA",
names: [{
name: "John"
}, {
name: "Paul"
}]
},
{
country: "UK",
names: [{
name: "Mary"
}]
}
]
我想知道如何使用reduce()或其他方法来达到预期的结果?
答案 0 :(得分:0)
您可以使用lodash flatten删除嵌套,但是我可以通过再次调用reduce来处理嵌套。 Lodash也有一个groupBy
,但这为您提供了一个键对象,这不是您想要的。因此,这是一个非基于lib的解决方案,它支持数组的无限嵌套。
const names = [[{
name: "John",
country: "USA"
}, {
name: "Mary",
country: "UK"
}], {
name: "Paul",
country: "USA"
}];
const reducer = (groupBy, el) => {
if (Array.isArray(el)) {
return el.reduce(reducer, groupBy);
} else {
const { country, ...rest } = el;
const group = groupBy.find(el => el.country === country);
if (group) {
group.names.push(rest);
} else {
groupBy.push({
country,
names: [rest]
})
}
return groupBy;
}
}
const groupBy = names.reduce(reducer, []);
console.log('groupBy:', groupBy);