Reducer 从数组返回 NAN
Reducer returning NAN from array
问题
我有一个这样的数组:
let oddsArray = [undefined, undefined, 5, 5]
还有一个reducer函数:
const reducer = (accumulator, currentValue) => accumulator + currentValue
当我调用 console.log 时,我得到了这个:
console.log(oddsArray.reduce(reducer, 1), 'oddsArray') /// NAN
直到数组不再包含undefined:
[5, 5, 5, 5] /// 20
我想要发生的事情
我希望能够将数组中的所有数字相加,即使该数组中包含未定义的值。所以初始数组应该等于:
let oddsArray = [undefined, undefined, 5, 5] // 10
我该如何实现?
谢谢!
您可以检查 undefined
值,如下所示:currentValue || 0
let oddsArray = [undefined, undefined, 5, 5]
const reducer = oddsArray.reduce((accumulator, currentValue) =>
accumulator + (currentValue || 0), 0);
console.log(reducer);
如果您需要更通用的方法,即仅对具有多种类型元素的数组中的数字求和,您可以使用 Number.isNaN() 检查 [=12 的当前值是否=]是否为数字:
let oddsArray = [undefined, undefined, 5, 5, null, "hola", {"foo":"bar"}];
const reducer = (acc, currVal) => acc + (isNaN(currVal) ? 0 : currVal);
let res = oddsArray.reduce(reducer, 0);
console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
问题
我有一个这样的数组:
let oddsArray = [undefined, undefined, 5, 5]
还有一个reducer函数:
const reducer = (accumulator, currentValue) => accumulator + currentValue
当我调用 console.log 时,我得到了这个:
console.log(oddsArray.reduce(reducer, 1), 'oddsArray') /// NAN
直到数组不再包含undefined:
[5, 5, 5, 5] /// 20
我想要发生的事情
我希望能够将数组中的所有数字相加,即使该数组中包含未定义的值。所以初始数组应该等于:
let oddsArray = [undefined, undefined, 5, 5] // 10
我该如何实现?
谢谢!
您可以检查 undefined
值,如下所示:currentValue || 0
let oddsArray = [undefined, undefined, 5, 5]
const reducer = oddsArray.reduce((accumulator, currentValue) =>
accumulator + (currentValue || 0), 0);
console.log(reducer);
如果您需要更通用的方法,即仅对具有多种类型元素的数组中的数字求和,您可以使用 Number.isNaN() 检查 [=12 的当前值是否=]是否为数字:
let oddsArray = [undefined, undefined, 5, 5, null, "hola", {"foo":"bar"}];
const reducer = (acc, currVal) => acc + (isNaN(currVal) ? 0 : currVal);
let res = oddsArray.reduce(reducer, 0);
console.log(res);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}