数组分组并减少 - Javascript

Array group and reduce - Javascript

我想对以下数组进行分组和归约:

    [
      {
        "code": "202008001",
        "estado": "borrador",
        "cliente": "ENTEL",
        "tipo": "Administracion"
      },
      {
        "code": "202008002",
        "estado": "borrador",
        "cliente": "ENTEL",
        "tipo": "Administracion"
      },
      {
        "code": "202008002",
        "estado": "borrador",
        "cliente": "ENTEL",
        "tipo": "Monitoreo Seguridad"
      },
    ]

首先我需要按 code 属性 分组,然后按 tipo 合并或减少。这是我想要的结果:

    [
      {
        "code": "202008001",
        "estado": "borrador",
        "cliente": "ENTEL",
        "tipos": ["Administracion"]
      },
      {
        "code": "202008002",
        "estado": "borrador",
        "cliente": "ENTEL",
        "tipos": ["Administracion","Monitoreo Seguridad"]
      }
    ]

我只使用 reduce 测试了多种形式来做到这一点,但没有任何成功。谢谢!

在reduce中,只检查是否存在具有相同代码的项目,如果存在,则推送到现有的.tipos,如果不存在,则添加一个新项目,但将tipo重命名为tipos并使其成为一个数组。

const r = [
  {
    "code": "202008001",
    "estado": "borrador",
    "cliente": "ENTEL",
    "tipo": "Administracion"
  },
  {
    "code": "202008002",
    "estado": "borrador",
    "cliente": "ENTEL",
    "tipo": "Administracion"
  },
  {
    "code": "202008002",
    "estado": "borrador",
    "cliente": "ENTEL",
    "tipo": "Monitoreo Seguridad"
  },
].reduce((carry, current) => {
    const existing = carry.find((el) => el.code === current.code);
    if (existing) existing.tipos.push(current.tipo);
    else {
        const {tipo, ...el} = current;
        carry.push({...el, tipos: [tipo]});
    }
    return carry;
}, []);

console.log(r);

使用 reduce 构建一个对象,该对象由代码中的属性组成,最后从中获取值,以数组形式获得所需的结果。
对于每个对象,我都会在 result-object 中查看它是否包含具有代码值的 属性。如果不是这样,那么添加这个 属性 一个存储作为新元素的值。在此之后,通过一个包含 tipo 的数组替换 属性 tipo。否则只需将新的 tipo 添加到 tipo 数组。

let arr =   [
      {
        "code": "202008001",
        "estado": "borrador",
        "cliente": "ENTEL",
        "tipo": "Administracion"
      },
      {
        "code": "202008002",
        "estado": "borrador",
        "cliente": "ENTEL",
        "tipo": "Administracion"
      },
      {
        "code": "202008002",
        "estado": "borrador",
        "cliente": "ENTEL",
        "tipo": "Monitoreo Seguridad"
      },
    ];
    
let result = Object.values(arr.reduce((acc, cur) => {
    if (!acc.hasOwnProperty(cur)) {
        acc[cur.code] = cur;
        acc[cur.code].tipo = [cur.tipo];
    } else {
        acc.tipo.push(cur.tipo);
    }
    return acc;
}, {}));

console.log(result);