javascript - 如何根据某个属性的值将元素数组拆分为组?

标签 javascript typescript

我有一个数组:

[{
    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/

相关文章:

javascript - typescript 中的TypeError : Cannot read property 'toArray' of null at Context. <anonymous>

javascript - 如何通过单击按钮在全日历中添加任何事件?

javascript - ionic 在另一个方法中调用提交方法无法正常工作

visual-studio - Visual Studio不将 typescript 编译为js文件

带有 Font Awesome 图标的 JavaScript 切换按钮

Angular 4 使用 ES2017(例如 string.prototype.padStart)

javascript - 从对象数组中获取单个属性数组

javascript - 使用麦克风时静音输出 - Audio Web API

javascript - 关于启动 JS 或 JQuery 进行文件处理的建议

javascript - 如何从 Promise 返回 Observable