Sum Of Fields In An Array Of Objects With Reduce Returns Nan
Solution 1:
When using Array.reduce()
, if you don't state an initial value, the 1st item of the array becomes the initial value. Since you want a number, and not an object as the result, initialize with 0. Since the accumulator is now a number, and not an object, use accumulator
instead of accumulator.a
in the function's body:
const array = [{a:1}, {a:2}, {a:3}];
constreducer = (accumulator, currentValue) => accumulator + currentValue.a;
console.log(array.reduce(reducer, 0));
You can also check if the accumulator is an object, and then try to access it's property, but I find it more confusing than simply stating an initial value:
const array = [{a:1}, {a:2}, {a:3}];
constreducer = (accumulator, currentValue) => (typeof accumulator === 'object' ? accumulator.a : accumulator) + currentValue.a;
console.log(array.reduce(reducer));
Solution 2:
Your reducer
returns a number value (sum of accumulator.a + currentValue.a
) while your accumulator
is an object.
Either initialize accumulator
to 0
or return the accumulator
itself, make it
constreducer = (accumulator, currentValue) => (accumulator.a += currentValue.a, accumulator);
Demo
const array = [{
a: 1
}, {
a: 2
}];
constreducer = (accumulator, currentValue) => (accumulator.a += currentValue.a, accumulator);
console.log(array.reduce(reducer, {
a: 0
}));
Note
- This reducer will return
{"a":3}
, but if you only want the sum value, print its propertya
i.e.
console.log(array.reduce(reducer, {
a: 0
}).a);
Solution 3:
You need to change your reducer function as
constreducer = (accumulator, currentValue) => ({ a: accumulator.a + currentValue.a });
your orignal code doesn't work as you return a Number
instead of an object whose property you were accessing.
Post a Comment for "Sum Of Fields In An Array Of Objects With Reduce Returns Nan"