是否有一个JavaScript或jQuery等同于Python的"sum"内置函数?

twn*_*ale 9 javascript python jquery

假设我有一个十进制数的数组容器.我想要总和.在Python中我会这样做:

x = [1.2, 3.4, 5.6]

sum(x)
Run Code Online (Sandbox Code Playgroud)

在JavaScript中是否有类似的简洁方法?

CMS*_*CMS 12

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

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
Run Code Online (Sandbox Code Playgroud)

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

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

reduce方法是ECMAScript第5版标准的一部分,可广泛使用,但不是IE <= 8,但是我可以从我链接的Mozilla开发中心中包含一个实现方法.


Rei*_*gel 7

我想没有...但你可以在javascript上制作一个

Array.prototype.sum = function() {
  return (! this.length) ? 0 : this.slice(1).sum() +
      ((typeof this[0] == 'number') ? this[0] : 0);
};
Run Code Online (Sandbox Code Playgroud)

用它,

[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
Run Code Online (Sandbox Code Playgroud)

演示


好的,正如评论中指出的那样,你也可以以非递归的方式来做

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;
};
Run Code Online (Sandbox Code Playgroud)

另一种方法,通过功能..

function sum(arr) {
   var num = 0;
   for (var i = 0; i < arr.length; i++) {
       num += (typeof arr[i] == 'number') ? arr[i] : 0;
   }
   return num;
};
Run Code Online (Sandbox Code Playgroud)

用它,

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

  • 这是一个可怕的解决方案.请不要修改对象原型.我遇到了这种废话的严重问题.写一个$ .sum jQuery插件,不要搞砸我们其他人. (4认同)
  • 出于好奇,这种递归实现不会轻易达到堆栈限制吗?有没有使用for循环的迭代解决方案的原因? (2认同)
  • @Stefan,希望我能+1000你 - 修改内置插件的能力是我在JS(和Ruby)中归类为缺陷的一个细节,它从来没有给我带来任何麻烦(特别是在JS中,因为我不是'多用Ruby ;-). (2认同)