首页 > 解决方案 > 如何根据一个值过滤和修改数组?

问题描述

我有一个数组:

[
  {name: "test", value: "test", group: 0},
  {name: "test1", value: "test2", group: 0},
  {name: "test3", value: "test3", group: 1},
  {name: "test4", value: "test4", group: 1},
  {name: "test5", value: "test5", group: 1},
  {name: "test6", value: "tes6t", group: 2},
  {name: "test7", value: "test7", group: 2},
]

我需要这个数组看起来像这样:

[
  {name: "test", value: "test", group: 0, selections: [
    {name: "test", value: "test", group: 0},
    {name: "test1", value: "test1", group: 0}
  ]},
  {name: "test3", value: "test3", group: 1, selections: [
    {name: "test3", value: "test3", group: 1},
    {name: "test4", value: "test4", group: 1},
    {name: "test5", value: "test5", group: 1}
  ]},
  {name: "test6", value: "tes6t", group: 2, selections: [
    {name: "test6", value: "tes6t", group: 2},
    {name: "test7", value: "test7", group: 2}
  ]},
]

根据组值过滤相同的项目,然后将所有相同的项目添加到第一个元素选择数组中,包括第一个。

如何在 JavaScript/TypeScript 中没有多个 for 数组的情况下以最佳方式实现它?

标签: javascripttypescript

解决方案


这可以使用Array.prototype.reduce.

const input = [
  {name: "test", value: "test", group: 0},
  {name: "test1", value: "test2", group: 0},
  {name: "test3", value: "test3", group: 1},
  {name: "test4", value: "test4", group: 1},
  {name: "test5", value: "test5", group: 1},
  {name: "test6", value: "tes6t", group: 2},
  {name: "test7", value: "test7", group: 2},
];

const groupBy = input.reduce((acc, cur) => {
  acc[cur.group] ? acc[cur.group].selections.push(cur) : acc[cur.group] = {
    ...cur,
    selections: [ cur ]
  };
  return acc;
}, {});
const output = Object.values(groupBy);
console.log(output);


推荐阅读