Tengo una serie de objetos como este:
arr = [ { a: "dog", b: 8, c: "male", d: "big", e: 100 }, { a: "dog1", b: 5, c: "female", d: "big", e: 200}, { a: "dog2", b: 18, c: "female", d: "big", e: 350}, { a: "dog2", b: 18, c: "female", d: "big", e: 350}, { a: "dog", b: 3, c: "male", d: "big", e: 100 }, { a: "dog", b: 8, c: "male", d: "big", e: 100 }, ]; Quiero crear una nueva matriz que contenga solo la propiedad a y la suma de e de esos objetos que tienen los mismos valores para b , c y d , de modo que tendré una matriz como esta:
arr2 = [ { a: "dog", e: 300 }, { a: "dog2", e: 700}, ]; Ya intenté usar una función de map dentro de una función de map buscando los elementos que tienen las mismas propiedades b , c y d , luego empujando el resultado en el arr2 , pero empuja cada vez todos los objetos de mi arr inicial.
Podría usar Array.reduce para crear un mapa de los elementos de la matriz, usando b, c y d combinados como clave.
Una vez que tengamos este mapa, podemos usar Object.values() para obtener una matriz como el resultado deseado.
arr = [ { a: 'dog', b: 8, c: 'male', d: 'big', e: 100 }, { a: 'dog1', b: 5, c: 'female', d: 'big', e: 200}, { a: 'dog2', b: 18, c: 'female', d: 'big', e: 350}, { a: 'dog2', b: 18, c: 'female', d: 'big', e: 350}, { a: 'dog', b: 3, c: 'male', d: 'big', e: 100 }, { a: 'dog', b: 8, c: 'male', d: 'big', e: 100 }, ]; const result = Object.values(arr.reduce((acc, cur) => { // Create a key from b,c,d.. const key = cur.b + cur.c + cur.d acc[key] = acc[key] || { a: cur.a, e: 0 }; acc[key].e += cur.e; return acc; }, {})) console.log('Result:', result); Si está buscando una solución Vanilla JS (sin lodash), puede encontrar algo, ajustable a la propiedad de clave de grupo arbitraria y propiedad para resumir con Array.prototype.reduce() :
Map , teniendo la propiedad deseada como clave;Map , en función de la clave coincidenteMap.prototype.values() de ese Map en una matriz const src = [ { a: "dog", b: 8, c: "male", d: "big", e: 100 }, { a: "dog1", b: 5, c: "female", d: "big", e: 200}, { a: "dog2", b: 18, c: "female", d: "big", e: 350}, { a: "dog2", b: 18, c: "female", d: "big", e: 350}, { a: "dog", b: 3, c: "male", d: "big", e: 100 }, { a: "dog", b: 8, c: "male", d: "big", e: 100 }, ] const summarizeValueByKey = (arr, key, val) => [...arr .reduce((acc,{[key]: keyProp, [val]: valProp}) => { const group = acc.get(keyProp) group ? group[val] += valProp : acc.set(keyProp, {[key]: keyProp, [val]: valProp}) return acc }, new Map) .values()] console.log(summarizeValueByKey(src, 'a', 'e'))