javascript - 如何根据某个属性的值将元素数组拆分为组?
问题描述
我有一个数组:
[{
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 编译器的抱怨。
问题:
- 有没有更好的方法来解决这个问题?
- 如果没有,上面的代码在成功添加类型的情况下会如何?如果不
在阿迪加斯评论后编辑
解决方案
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)
};
});
}
推荐阅读
- ios - GCD串行异步队列与嵌套在异步中的串行同步队列
- python - 如何在 Python 2 中使用 glob() 递归查找路径?
- javascript - Touchstart 和 Touchend 在移动设备上不起作用
- kubernetes - 如何在 kubernetes Dashboard 上将用户限制为一个命名空间?
- python - VS Code Python 脚本第二天突然停止工作
- python - Django app on heroku, ModuleNotFoundError: No module named 'spread'
- android - 如何在 Android Worker 中完成 Kotlin Flow
- git - Mac中的Git碰撞路径
- windows - Unable to install Docker Desktop 3.0.0 onto Windows Server 2019 DataCenter
- java - 访问特定索引处的数组