我有这个带数字的简单数组:
var arr = [100,200,undefined,450,300];
我想用reduce
快速总结一下这个数组中的值......
var total = arr.reduce( function( s, v ){ return s += v } );
在return
我得到NaN
。
有没有办法让reduce
对未定义值的数组中的值求和?像旗帜或其他东西......谢谢!
答案 0 :(得分:7)
您可以使用falsy值的默认值(undefined
,null
,0
,''
以及其他值{{3像
v || 0
这意味着,如果v
是logical OR ||
值,则取该值,如果不是,则取零。
var arr = [100, 200, undefined, 450, 300],
total = arr.reduce(function (s, v) { return s + (v || 0); }, 0);
console.log(total);

BTW,
s += v
^
没有必要,因为你不再在函数中使用s
了。返回值是下一循环中s
的新值。回调的变量是独立的,它们有自己的范围。
根据评论,如果给出了不需要的各种类型的项目,则需要规范化数据。
过滤不需要的部分,
.filter(v => !isNaN(v))
将所需部件转换为相同类型
.map(Number)
然后你需要一个折叠数据的函数,只得到两个值中的单个值,如加法。
function add(a, b) {
return a + b;
}
此功能现在用作带{/ 3>的truthy的回调
initialValue
(可选)用作第一次调用
callback
的第一个参数的值。如果未提供初始值,则将使用数组中的第一个元素。在没有初始值的空数组上调用reduce()
是错误的。
result = array
.filter(v => !isNaN(v))
.map(Number)
.reduce(add, 0);
答案 1 :(得分:4)
您可以在减少数组之前过滤掉非数字。
这不是减少列表的最有效方法,但它是最明确的分离功能的地方,因此您可以轻松地遵循逻辑而无需阅读更复杂的逻辑。
var arr = [100,200,undefined,450,300,'string'];
var total = arr
.filter(function(x) { return typeof(x) === 'number'}) // remove any non numbers
.reduce(function( s, v ){ return s + Number(v) }, 0);
console.log(
total
)
答案 2 :(得分:2)
只需要三元组就可以了
var arr = [100, 200, undefined, 450, 300];
var total = arr.reduce(function(s, v) {
return v ? s += v : s += 0
});
console.log(total);
答案 3 :(得分:2)
尝试filter()
:
var arr = [100,200,undefined,450,300];
var total = arr.filter(i=>i != undefined).reduce( function( s, v ){
return s += v;
}, 0);
console.log(total)