我有两个长度相等的数组,我需要将它们对应(按索引)的值相乘,并将结果求和。
例如:
var arr1 = [2,3,4,5];
var arr2 = [4,3,3,1];
这将得出34(4*2+3*3+4*3+5*1)。
怎样最简单易读地写出这个式子?
例如:
var arr1 = [2,3,4,5];
var arr2 = [4,3,3,1];
这将得出34(4*2+3*3+4*3+5*1)。
怎样最简单易读地写出这个式子?
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
这展示了计算两个向量点积的“函数式”方法,而不是“命令式”方法。在所请求的简单函数实现中,更加简洁的函数式方法(通常更受欢迎)被优先考虑。
var sum = 0;
for(var i=0; i< arr1.length; i++) {
sum += arr1[i]*arr2[i];
}
for(var i=0; i<arr1.length; sum+=arr1[i]*arr2[i], i++);
。 - CaffGeek其他答案可能更有效率,但是出于递归的角度考虑(在某些其他语言中会更好),这里提供一种方法。它假设两个数组长度相等,因为您没有指定如果不相等该怎么办。
function sumProducts(array1, array2) {
if(array1.length)
return array1.pop() * array2.pop() + sumProducts(array1, array2);
return 0;
}
编辑:
katspaugh建议翻转返回值,这样会稍微更高效(不需要对长度进行!
)。
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/
var i, result = 0;
for(i = 0; i < arr1.length; i++)
result += arr1[i]*arr2[i];
alert(result);
虽然如果arr2比arr1短不会导致错误,但是您说它们长度相等,所以我没有检查它。
我认为最易于阅读的写法是使用简单的for循环:
var ii, sumOfProds = 0;
for (ii = 0; ii < arr1.length && ii < arr2.length; ii++) {
sumOfProds += arr1[ii] * arr2[ii];
}
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))
使用ES6的.reduce()方法可以实现单行解决方案:
const sum_products = arr1.reduce((sum, val, i) => sum + (val * arr2[i]), 0)
类似这样的内容:
var sum = 0;
for (var i=0, len = arr1.length; i < len; i++) { // optimized looping
sum += arr1[i] * arr2[i];
}
i
。有点毛骨悚然,是吧? - Chris Baker