我有一个数组:
[{
name: "A1"
series: "A series"
},
{
name: "A2"
series: "A series"
},
{
name: "B1"
series: "B series"
},
{
name: "C1"
// series is not defined
}]
我想将此数组拆分为多个数组,并按其系列属性的值分组。我想要得到类似下面的结构。但只要结果包含按系列属性值分组的数组,确切的格式并不重要。
[
{
series: "A series",
items: [{
name: "A1"
},
{
name: "A2"
}]
},
{
series: "B series",
items: [{
name: "B1"
}]
}
{
items: [{
name: "C1"
}]
}
]
这是我最好的尝试:
private groupProductsBySeries = (devices: IItem[]): IProductGroup[] => {
const seriesSymbols: any = new Map();
const itemsBySeries: any = [];
const series: any = [];
devices.forEach((device) => {
let symbol = seriesSymbols.get(device.properties.series);
if (!symbol) {
symbol = Symbol();
seriesSymbols.set(device.properties.series, symbol);
}
Array.isArray(itemsBySeries[symbol])
? itemsBySeries[symbol].push(device)
: (itemsBySeries[symbol] = [device]);
});
seriesSymbols.forEach((value: any, key: any) => {
series.push({
name: key,
items: itemsBySeries[value],
});
});
return series;
};
我想这可能是不必要的复杂。当我尝试添加类型时,我收到了 TypeScript 编译器的提示。
问题:
- 有更好的方法来解决这个问题吗?
- 如果没有,成功添加类型后上面的代码会是什么样子? 如果没有
在 adigas 评论后编辑
最佳答案
function groupProductsBySeries(devices) {
const series = Array.from(new Set(devices.map(item => item.series)));
return series.map(item => {
const series = item ? { series: item } : null;
return {
...series,
items: devices.filter(device => device.series === item)
};
});
}
关于javascript - 如何根据某个属性的值将元素数组拆分为组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58283744/