Tengo una serie de objetos como este:
const arr = [ {"id" : 1, "name" : "john", "age": 12, "fruits": "banana"}, {"id" : 2, "name" : "john", "age": 12, "fruits": "apple"} {"id" : 3, "name" : "maria", "age": 13, "fruits": "grappes"} {"id" : 4, "name" : "maria", "age": 13, "fruits": "blackberry"} {"id" : 5, "name" : "camille", "age": 12, "fruits": "cherry"} ]Me gustaría tener un solo objeto para cada persona (nombre) y agregar sus objetos.
Entonces la matriz final sería:
const arr = [ {"id" : 1, "name" : "john", "age": 12, "fruits": ["banana", "apple"]}, {"id" : 3, "name" : "maria", "age": 13, "fruits": ["grappes", "blackberry"]} {"id" : 5, "name" : "camille", "age": 12, "fruits": ["cherry"]} ];La matriz real que estoy usando es muy grande, es por eso que estoy buscando la forma más eficiente de hacerlo.
Puede usar Array.prototype.reduce para agrupar los objetos.
const arr = [ { id: 1, name: "john", age: 12, fruits: "banana" }, { id: 2, name: "john", age: 12, fruits: "apple" }, { id: 3, name: "maria", age: 13, fruits: "grappes" }, { id: 4, name: "maria", age: 13, fruits: "blackberry" }, { id: 5, name: "camille", age: 12, fruits: "cherry" }, ]; const output = Object.values( arr.reduce((res, o) => { if (!res[o.name]) { res[o.name] = { ...o, fruits: [] }; } res[o.name].fruits.push(o.fruits); return res; }, {}) ); console.log(output);También puede escribir la solución anterior de manera más sucinta:
const arr = [ { id: 1, name: "john", age: 12, fruits: "banana" }, { id: 2, name: "john", age: 12, fruits: "apple" }, { id: 3, name: "maria", age: 13, fruits: "grappes" }, { id: 4, name: "maria", age: 13, fruits: "blackberry" }, { id: 5, name: "camille", age: 12, fruits: "cherry" }, ]; const output = Object.values( arr.reduce( (res, o) => ((res[o.name] ||= { ...o, fruits: [] }).fruits.push(o.fruits), res), {} ) ); console.log(output);