问题描述
我想分组并减少以下数组:
[
{
"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);