javascript使用未定义的值减少sum数组

时间:2018-02-04 09:57:40

标签: javascript

我有这个带数字的简单数组:

var arr = [100,200,undefined,450,300];

我想用reduce快速总结一下这个数组中的值......

var total = arr.reduce( function( s, v ){ return s += v } );

return我得到NaN

有没有办法让reduce对未定义值的数组中的值求和?像旗帜或其他东西......谢谢!

4 个答案:

答案 0 :(得分:7)

您可以使用falsy值的默认值(undefinednull0''以及其他值{{3像

一样
v || 0

这意味着,如果vlogical 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)