数组分组并减少 - 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);
我想对以下数组进行分组和归约:
[
{
"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);