SO answer: How to calculate numbers within an array of objects
Link to question in output
by KooiInc MeHere
HTML
<script src="https://kooiinc.github.io/JSHelpers/Helpers-min.js"></script>
<div class="solink" data-linkid="57534742"></div>
<pre id="result"></pre>
JavaScript
const log = (() => {
const result = document.querySelector("#result");
return x => result.textContent += typeof x === "object" ? `${JSON.stringify(x, null, " ")}\n` : `${x}\n`;
})();
const valueOrZero = (value, replacement = 0) => !isNaN(+value) ? +value : replacement;
const sumAll = arr =>
arr
.reduce( (sum, v) =>
sum + Object.values(v)
.reduce( (localSum, v) => localSum + valueOrZero(v), 0 ), 0 );
const calcSums = someArray => someArray
.reduce( (sums, val) => {
Object.keys(val)
.forEach( v =>
sums[`∑[${v}]`] = !(`∑[${v}]` in sums)
? valueOrZero(val[v])
: sums[`∑[${v}]`] + valueOrZero(val[v]) );
return sums;
}, {} );
let someArray = [{a: 1}, {a: 2}, {a: 3}, {b: 4}, {b: 5}];
log("\nDefault")
log(calcSums(someArray));
someArray = someArray.concat([{a:3, c:7, d:8, b:-1}, {a:22}]);
log("\nMore key-(numeric)value combinations")
log(calcSums(someArray));
log("\nNone number values count as 0")
someArray = someArray.concat([{hi: "there", c:33, b:2, a:-22}]);
log(calcSums(someArray));
log("\nCheck 'sum-hi' ;)");
someArray = someArray.concat([{hi: 123, c:33, b:2, a:2, some:{a:1, b:2}}]);
log(calcSums(someArray));
log("\nGrand total for numeric values in [someArray]");
log(`∑ Numbers in [someArray] = ${sumAll(someArray)}`);