数组分组和归约-Javascript

问题描述

我想分组并减少以下数组:

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

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

    [
      {
        "code": "202008001","tipos": ["Administracion"]
      },"tipos": ["Administracion","Monitoreo Seguridad"]
      }
    ]

我测试了多种形式,仅使用 reduce 即可完成此操作,但没有成功。谢谢!

解决方法

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

const r = [
  {
    "code": "202008001","estado": "borrador","cliente": "ENTEL","tipo": "Administracion"
  },{
    "code": "202008002","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构建一个对象,该对象包含代码中的属性,最后从中获取值并以数组的形式获得所需的结果。
对于每个对象,如果它包含一个具有代码中值的属性,我将查看结果对象。如果不是这样,则将该属性添加一个存储作为新元素的值。在此之后,通过内部带有Tipo的数组替换属性tipo。否则,只需将新的Tipo添加到tipo数组中即可。

let arr =   [
      {
        "code": "202008001","tipo": "Administracion"
      },{
        "code": "202008002","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);

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...