Javascript:将两个数组相乘并求和

18
我有两个长度相等的数组,我需要将它们对应(按索引)的值相乘,并将结果求和。

例如:

var arr1 = [2,3,4,5];
var arr2 = [4,3,3,1];

这将得出34(4*2+3*3+4*3+5*1)。

怎样最简单易读地写出这个式子?


2
多奇怪啊!所有这些答案都是在同一时间发布的,所以我们不可能看到彼此的答案……看看我们选择用于 for 循环的变量名称 - 每个人都选择了 i。有点毛骨悚然,是吧? - Chris Baker
四个结果,本质上都是相同的...该投哪一个赞? :P - Reid
@Reid 给我点赞,即使在 JavaScript 中我实际上不会用这种递归版本来解决这个特定的问题,但它是不同的! - Endophage
1
我给其他人的答案点了赞! :) - Ryan Doherty
16个回答

23
var arr1 = [2,3,4,5];
var arr2 = [4,3,3,1];
console.log(arr1.reduce(function(r,a,i){return r+a*arr2[i]},0));
34

这展示了计算两个向量点积的“函数式”方法,而不是“命令式”方法。在所请求的简单函数实现中,更加简洁的函数式方法(通常更受欢迎)被优先考虑。


2
请解释这个帮助OP的原因 - nomistic

14
var sum = 0;
for(var i=0; i< arr1.length; i++) {
    sum += arr1[i]*arr2[i];
}

9
第二行也可以写成 for(var i=0; i<arr1.length; sum+=arr1[i]*arr2[i], i++); - CaffGeek

7
var a = [1,2,3,4,5];
var b = [5,4,3,2,1];

a.map(function(x, index){ //here x = a[index]
 return b[index] + x 
});

=>[6,6,6,6,6]

//if you want to add the elements of an array:

a.reduce(function(x, y){
 return x + y
});

=>15

您可以在这里了解有关 Array.map 的信息。

以及在这里了解有关 Array.reduce 的信息。


5

其他答案可能更有效率,但是出于递归的角度考虑(在某些其他语言中会更好),这里提供一种方法。它假设两个数组长度相等,因为您没有指定如果不相等该怎么办。

function sumProducts(array1, array2) {
    if(array1.length) 
        return array1.pop() * array2.pop() + sumProducts(array1, array2);

    return 0;
}

编辑:

katspaugh建议翻转返回值,这样会稍微更高效(不需要对长度进行)。


4
var arr1 = [2,3,4,5];
var arr2 = [4,3,3,1];


var result = 0;
for (var i=0; i < arr1.length; i++) {
  result += (arr1[i] * arr2[i]);
}

alert(result);

Try it here: http://jsfiddle.net/VQKPt/


谁在给所有这些正确的回答点踩需要停止并解释他们的理由,或者干脆就停止。 - Chris Baker

3
var i, result = 0;
for(i = 0; i < arr1.length; i++)
    result += arr1[i]*arr2[i];
alert(result);

虽然如果arr2比arr1短不会导致错误,但是您说它们长度相等,所以我没有检查它。


3

我认为最易于阅读的写法是使用简单的for循环:

var ii, sumOfProds = 0;
for (ii = 0; ii < arr1.length && ii < arr2.length; ii++) {
    sumOfProds += arr1[ii] * arr2[ii];
}

3
function mul (arr1, arr2) {
    var n_array = (arr1,arr2).map(x => x * x)
    return n_array
    }
var a = [1,2,3]
var b = [1,2,3]
console.log(mul(a,b))

2

使用ES6的.reduce()方法可以实现单行解决方案:

const sum_products = arr1.reduce((sum, val, i) => sum + (val * arr2[i]), 0)

(说明:这行代码可以对两个数组中对应位置的值进行相乘,然后将所有结果相加得到一个总和)

2

类似这样的内容:

var sum = 0;
for (var i=0, len = arr1.length; i < len; i++) {     // optimized looping
   sum += arr1[i] * arr2[i];
}

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