¿Podría sugerir algún código más corto para resolver el siguiente problema? Tengo variedad de objetos:
const arr1=[ { '1': { grade: 1.3, counter: 2 } }, { '1': { grade: 2.8, counter: 2 } }, { '2': { grade: 4.5, counter: 1 } }, { '2': { grade: 2.4, counter: 1 } } ]la salida debe verse como:
const obj1={ '1': {grade:4.1,counter:4} '2': {grade:6.9,counter:2} }aquí está el código que he probado:
arr1.reduce((acc,e)=> { let element = Object.keys(e) if(!acc.hasOwnProperty(element)){ acc[element]={grade:0,counter:0} } acc[element].grade+= e[element].grade acc[element].counter+= e[element].counter return acc }, {})Gracias
Su problema aquí es que Object.keys(e) devuelve una matriz de claves y no una sola clave.
Si su objeto siempre será el mismo (con una clave), puede obtener la clave con: let element = Object.keys(e)[0]
He descompuesto el código con 2 partes principales.
const key = Object.keys(current)[0] ) const arr1 = [{ '1': { grade: 1.3, counter: 2 } }, { '1': { grade: 2.8, counter: 2 } }, { '2': { grade: 4.5, counter: 1 } }, { '2': { grade: 2.4, counter: 1 } } ] const newObject = arr1.reduce((newObject, current) => { const key = Object.keys(current)[0] const associatedObject = newObject[key] if (associatedObject) { associatedObject.grade += current[key].grade associatedObject.counter += current[key].counter } else { newObject[key] = current[key] } return newObject }, {}) console.log(newObject)Prueba esto
let arr1=[{'1': {grade: 1.3, counter: 2}},{'1': {grade: 2.8, counter: 2}},{'2': {grade: 4.5, counter: 1}},{'2': {grade: 2.4, counter: 1}}]; arr1 = arr1.reduce((acc, obj) => { let [k, v] = Object.entries(obj)[0]; if(!acc.hasOwnProperty(k)) acc[k] = {grade:0,counter:0}; acc[k].grade += v.grade; acc[k].counter += v.counter; return acc }, {}); console.log(arr1)Yo iría por:
arr1.reduce((o,n)=>{ Object.keys(n).forEach((key)=>{ if(!o[key]) o[key]={grade:0, counter:0}; o[key]["grade"] += n[key]["grade"]; o[key]["counter"] += n[key]["counter"]; }); return o; },{});Paso 1: reduciendo sobre la matriz, acc = {}
Paso 2: iterando sobre cada clave del objeto en el índice actual
Paso 3: resumiendo las propiedades correspondientes
Se olvidó de iterar sobre las claves .
Comentario: Como pons asinorum , uso para array.reduce() los nombres de las variables:
o que significa valor antiguo (=acc=_accumulator)n significa nuevo valor .