javascript中的和数组

javascript中的和数组,javascript,arrays,Javascript,Arrays,我有以下阵列: // I want to calculate these arrays each other. var a = [1,2,3] var b = [1,2,3] var c = [3,4,5] // -> var result = [5, 8, 11] 我可以用下面的方法计算两个数组,但如何求n数组的和 Array.prototype.Sum = function (arr) { var s = []; if (arr != null &&

我有以下阵列:

// I want to calculate these arrays each other.
var a = [1,2,3]
var b = [1,2,3]
var c = [3,4,5]
// ->
var result = [5, 8, 11]
我可以用下面的方法计算两个数组,但如何求n数组的和

Array.prototype.Sum = function (arr) {
    var s = [];
    if (arr != null && this.length == arr.length) {
        for (var i = 0; i < arr.length; i++) {
            var c = this[i] + arr[i]
            s.push(c);
        }
    }
    return s;
}
Array.prototype.Sum=函数(arr){
var s=[];
if(arr!=null&&this.length==arr.length){
对于(变量i=0;i
应该可以了。

假设

var arrays = [
    [1,2,3],
    [1,2,3],
    [3,4,5]
];
将您的
Sum
与EcmaScript 5数组方法结合使用

var result = arrays.reduce(function(arr1, arr2){
    return arr1.Sum(arr2);
});

另一方面,考虑不要污染<代码>数组。 或者,使用EcmaScript 6箭头函数进行简化

var result = arrays.reduce(
    (arr1, arr2) => arr1.map(
        (num, index) => num+arr2[index]
    )
);

使用此函数,您可以对多个数组求和,而无需将数组“封装”到另一个数组中

此外,它也适用于旧浏览器

function Sum(){
  if (arguments.length == 0){
    return null;
  }
  var s = arguments[0];
  for(var j = 1; j < arguments.length; j++) {
     var arr = arguments[j];
     for (var i = 0; i < arr.length; i++) {
         s[i] = s[i] + arr[i];
     }
  }
  return s;
}
函数和(){
if(arguments.length==0){
返回null;
}
var s=参数[0];
对于(var j=1;j
只要调用
Sum(a,b)
Sum(a,b,c)


如果您愿意,您也可以将其放在原型中(如果您想就地求和,可以对使用
进行一些更改)。

一个简单的旧ECMAScript 3解决方案:

var arrays = [
    [1, 2, 3],
    [1, 2, 3],
    [3, 4, 5]
];

function sum() {
  var sum = [];
  for(var i = 0; i < arguments.length; ++i) {
    for(var j = 0; j < arguments[i].length; ++j)
      sum[j] = (sum[j] || 0) + arguments[i][j];
  } return sum;
}

sum.apply(this, arrays);              // [ 5, 8, 11 ]
sum(arrays[0], arrays[1], arrays[2]); // [ 5, 8, 11 ]
var数组=[
[1, 2, 3],
[1, 2, 3],
[3, 4, 5]
];
函数和(){
var总和=[];
对于(变量i=0;i
a.sum(b).sum(c)
?注意小写字母s,
Sum
不是构造函数。;-)您需要类似于
zipWith
@RobG的东西,我有大约5k个这样的数组。@如果您有那么多,您应该会发现循环答案比使用内置方法的要快得多,请查看哪里的循环比内置方法快10倍。不要根据代码行来判断解决方案。;-)不是这样,
result
给出的
[6,6,12]
应该是
[5,8,11]
@elclanrs True,已修复。谢谢,这是我要找的。请注意和函数是ECMAScript 5规范的一部分,它仅受支持。如果这对您来说是个问题,那么您必须使用,这会将功能添加到较旧的浏览器中。请注意,for循环几乎总是比map和reduce等方法更快。代码稍微多一点,但速度更快。循环速度很快,您可能会发现
sum.push(…)
sum[j]=…
快。但这不会保留语义。我正在访问每个
sum[j]
参数.length
次(给定输入数组具有相同的长度)。第一个if块是冗余的。如果没有提供任何参数,s将是未定义的,外部for循环将不会运行,因此将返回未定义的。或者您可以执行
返回s | | null,但未定义对我来说更有意义。;-)
function Sum(){
  if (arguments.length == 0){
    return null;
  }
  var s = arguments[0];
  for(var j = 1; j < arguments.length; j++) {
     var arr = arguments[j];
     for (var i = 0; i < arr.length; i++) {
         s[i] = s[i] + arr[i];
     }
  }
  return s;
}
var arrays = [
    [1, 2, 3],
    [1, 2, 3],
    [3, 4, 5]
];

function sum() {
  var sum = [];
  for(var i = 0; i < arguments.length; ++i) {
    for(var j = 0; j < arguments[i].length; ++j)
      sum[j] = (sum[j] || 0) + arguments[i][j];
  } return sum;
}

sum.apply(this, arrays);              // [ 5, 8, 11 ]
sum(arrays[0], arrays[1], arrays[2]); // [ 5, 8, 11 ]