有没有类似于Python中“sum”内置函数的JavaScript或jQuery等效函数?

12

假设我有一个包含十进制数字的类数组容器。我想要它们的和。在Python中,我会这样做:

x = [1.2, 3.4, 5.6]

sum(x)

是否有类似简洁的方法在 JavaScript 中实现这个功能?

3个回答

13

另一种简单的迭代函数方法:

function sum(arr) {
  var result = 0, n = arr.length || 0; //may use >>> 0 to ensure length is Uint32
  while(n--) {
    result += +arr[n]; // unary operator to ensure ToNumber conversion
  }
  return result;
}

var x = [1.2, 3.4, 5.6];
sum(x); // 10.2

使用 Array.prototype.reduce 的另一种方法:

var arr = [1.2, 3.4, 5.6];
arr.reduce(function (a, b) { return a + b; }, 0); // 10.2

reduce 方法是 ECMAScript 5 标准的一部分,已经广泛使用,但在 IE <= 8 上不可用,不过可以从我提供的 Mozilla 开发中心链接中包含其实现。


7
我想没有现成的...但你可以用JavaScript自己创建一个。
Array.prototype.sum = function() {
  return (! this.length) ? 0 : this.slice(1).sum() +
      ((typeof this[0] == 'number') ? this[0] : 0);
};

使用它作为,

[1,2,3,4,5].sum() //--> returns 15
[1,2,'',3,''].sum() //--> returns 6
[].sum() //--> returns 0    
x = [1.2, 3.4, 5.6]
x.sum(); // returns 10.2

演示


好的,正如评论中指出的那样,您也可以以非递归方式完成它。

Array.prototype.sum = function() {
   var num = 0;
   for (var i = 0; i < this.length; i++) {
       num += (typeof this[i] == 'number') ? this[i] : 0;
   }
   return num;
};

另一种方法是通过函数实现...
function sum(arr) {
   var num = 0;
   for (var i = 0; i < arr.length; i++) {
       num += (typeof arr[i] == 'number') ? arr[i] : 0;
   }
   return num;
};

将其用作,

sum([1,2,3,4,5]) //--> returns 15
x = [1.2, 3.4, 5.6]
sum(x); // returns 10.2

2
只是出于好奇,这个递归实现不会很容易达到堆栈限制吗?有没有理由不使用带有for循环的迭代解决方案? - catchmeifyoutry
4
这是一个可怕的解决方案。请不要去修改对象原型。我曾遇到过这种无意义的严重问题。编写一个名为 $.sum 的 jQuery 插件,不要损坏我们其他人的代码。 - Stefan Kendall
2
@Stefan,真希望我能给你+1000个赞——修改内置函数的能力是我认为JS(和Ruby)中的一个缺陷,它从来没有给我带来过任何好处(特别是在JS中,因为我不太常用Ruby;-)。 - Alex Martelli
@CMS,感谢提供链接... @Stefan,你能否帮我把上面的函数编辑成$.sum - Reigel Gallarde
编写静态的jQuery插件方法非常简单。只需在函数前面添加$.sum =,您就拥有了一个jQuery插件:P - Stefan Kendall
显示剩余3条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接