Quiero sumar todas las filas a una sola fila en la matriz de JavaScript
var input=[ {id: 'id1', type: "A", active: 3}, {id: 'id2', type: "A", active: 5}, {id: 'id3', type: "B", active: 3}, {id: 'id4', type: "B", active: 4}, {id: 'id5', type: "C", active: 8}, {id: 'id6', type: "C", active: 5}, {id: 'id7', type: "C", active: 6}, {id: 'id8', type: "C", active: 7}, ];Rendimiento esperado
[ {id: NaN, type: NaN, active: 41} ] var input=[ {id: 'id1', type: "A", active: 3}, {id: 'id2', type: "A", active: 5}, {id: 'id3', type: "B", active: 3}, {id: 'id4', type: "B", active: 4}, {id: 'id5', type: "C", active: 8}, {id: 'id6', type: "C", active: 5}, {id: 'id7', type: "C", active: 6}, {id: 'id8', type: "C", active: 7}, ]; const t1 = performance.now(); var output=[{}];Object.keys(input[0]).forEach(function(item){ var s=0; input.forEach(function(itema){ s+=parseInt(itema[item]); }); if(!isNaN(s)) output[0][item]=s; else output[0][item]=''; }) const t2 = performance.now(); console.log('output:', output, `in ${t2 - t1}ms`);¿Hay otra manera más fácil? Gracias por adelantado
Puede usar reducir a la suma de enteros cada entrada en cada objeto.
const input = [{"id":"id1","type":"A","active":3},{"id":"id2","type":"A","active":5},{"id":"id3","type":"B","active":3},{"id":"id4","type":"B","active":4},{"id":"id5","type":"C","active":8},{"id":"id6","type":"C","active":5},{"id":"id7","type":"C","active":6},{"id":"id8","type":"C","active":7}]; const t1 = performance.now(); const output = input.reduce((acc, obj) => Object.fromEntries( Object.entries(acc).map(([key, val]) => [ key, parseInt(val, 10) + parseInt(obj[key], 10), ]) ) ); const t2 = performance.now(); console.log(output, `in ${t2 - t1}ms`);Esto debería funcionar con cualquier estructura de objeto plano, siempre que todos los objetos de la matriz tengan la misma forma.