Tengo una matriz que se ve así (simplificado):
[ { name: 'Store1', price: ['10'], somethingElse: null }, { name: 'Store2', price: ['5'], somethingElse: 6 }, { name: 'Store2', price: ['15'], somethingElse: 6 }, ]
Necesito convertirlo en esto:
[ { name: 'Store1', price: ['10'], somethingElse: null }, { name: 'Store2', price: ['5', '15'], somethingElse: 6 }, ]
Entonces, para cada objeto donde el name
es el mismo, toma el price
de todos ellos y los coloca en una matriz, y reduce la cantidad de entradas con el mismo name
a una.
Necesita funcionar para una matriz mucho más larga y con muchos name
.
Supongamos que todo lo que no sea el price
será el mismo en cada objeto que tenga el mismo name
.
Lo he intentado durante demasiado tiempo usando array.reduce
pero sin suerte.
const input = [ { name: 'Store1', price: ['10'], somethingElse: null }, { name: 'Store2', price: ['5'], somethingElse: 6 }, { name: 'Store2', price: ['15'], somethingElse: 6 }, ] const output = input.reduce((a,c) => { if(a.find(i => i.name === c.name)) { // Check if 'name' already exist return a.map(el => el.name === c.name ? ({...el, price: [...el.price, ...c.price]}) : el) // updating price for existed name } else { return [...a, c] // no such name, should add to ouput result } }, []) console.log(output)
Puede utilizar la agrupación por enfoque hash:
const data = [{"name":"Store1","price":["10"],"somethingElse":null},{"name":"Store2","price":["5"],"somethingElse":6},{"name":"Store2","price":["15"],"somethingElse":6}]; const result = Object.values(data.reduce((acc, obj) => { acc[obj.name] ??= obj; if (!acc[obj.name].price.includes(...obj.price)) acc[obj.name].price.push(...obj.price); return acc; }, {})); console.log(result);
.as-console-wrapper{min-height: 100%!important; top: 0}