Tengo la siguiente matriz, por ejemplo:
[ { name: "abc", value: "1" }, { name: "xyz", value: "2" }, { name: "abc", value: "3" }, { name: "abc", value: "4" }, { name: "xyz", value: "5" }, ]
Ahora, quiero reducir esta matriz a un solo objeto agrupando el value
con el mismo name
en una matriz. Algo como esto -
{ abc: [1, 3, 4], xyz: [2, 5] }
¿Cómo hago esto usando reduce
en JavaScript?
No estoy seguro de si este es el enfoque correcto, pero he intentado algo como esto y no me da el resultado deseado.
const data = arr.reduce((acc, item) => { return { ...acc, [item.name]: [item.value, acc[item.value]] }; });
Estaba en el camino correcto con su respuesta, pero necesita verificar si acc
ya tiene una clave de item.name
:
const data = [{ name: "abc", value: "1" }, { name: "xyz", value: "2" }, { name: "abc", value: "3" }, { name: "abc", value: "4" }, { name: "xyz", value: "5" }, ] const result = data.reduce((acc, { name, value }) => ({ ...acc, [name] : [...(acc[name] || []), value] }), {}) console.log(result)
Tenga en cuenta que puede usar la desestructuración de objetos para simplificar el código de acumulación.
const data=[ { name: "abc", value: "1" }, { name: "xyz", value: "2" }, { name: "abc", value: "3" }, { name: "abc", value: "4" }, { name: "xyz", value: "5" }, ]; const res=data.reduce((a,c)=>{ (a[c.name]??=[]).push(c.value); return a; },{}); console.log(res);
const data = [{ name: "abc", value: "1" }, { name: "xyz", value: "2" }, { name: "abc", value: "3" }, { name: "abc", value: "4" }, { name: "xyz", value: "5" }, ]; let finalObject = {}; data.forEach((item) => { if (!finalObject.hasOwnProperty(item.name)) { finalObject[item.name] = [item.value]; } else { finalObject[item.name].push(item.value); } }); console.log(finalObject);
Simplemente analice los valores si necesita una cadena a un número y le dará una respuesta
{ abc: [1, 3, 4], xyz: [2, 5] }