Javascript:乘法和求和两个数组

时间:2011-07-28 21:50:16

标签: javascript arrays math

我有两个长度相等的数组,我需要在每个数组中乘以相应的(按索引)值,然后对结果求和。

例如

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

将导致34(4 * 2 + 3 * 3 + 4 * 3 + 5 * 1)。

最简单的阅读方法是什么?

16 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:9)

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

这显示了&#34;功能性&#34;接近而不是强制性的#34;计算两个向量的点积的方法。功能方法(往往更简洁)在OP所要求的简单功能实现中是首选。

答案 2 :(得分:5)

其他答案几乎肯定更有效,但只是为了给你一个递归的观点(在其他一些语言中它更好)。它确实假设两个数组的长度相同,如果它们没有指定该怎么做。

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

    return 0;
}

编辑:

katspaugh建议翻转返回的效率更高一些(不需要!长度)。

答案 3 :(得分: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);

在此处试试:http://jsfiddle.net/VQKPt/

答案 4 :(得分:3)

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

如果arr2比arr1短,这不会导致错误,但是你说它们长度相等,所以我没有费心去检查它。

答案 5 :(得分:3)

我对最简单的阅读方式的投票归于简单的for循环:

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

答案 6 :(得分:3)

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 here的信息。 和Array.reduce here

答案 7 :(得分:2)

这样的事情:

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

答案 8 :(得分:2)

这对我来说非常简单

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

答案 9 :(得分:2)

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))

答案 10 :(得分:1)

声明执行所需操作的函数。

var sum      = function(a, b){ return a + b; };
var subtract = function(a, b){ return a - b; };
var multiply = function(a, b){ return a * b; };
var divide   = function(a, b){ return a / b; };

然后你有一种非常易读的方法可以在两个数组上执行任何操作:

var array1 = [1,2,3];
var array2 = [2,4,8];

operateArrays(array1, array2, sum);      //[3, 6, 11]
operateArrays(array1, array2, subtract); //[-1, -2, -5]
operateArrays(array1, array2, multiply); //[2, 8, 24]
operateArrays(array1, array2, divide);   //[0.5, 0.5, 0.375]

使用此功能

/**
* Divide each number of an array of numbers by another array of numbers
* @param  {Array}    arrayA  The array of numbers
* @param  {Array}    arrayB  The array of numbers
* @param  {Function} fn      Function that performs an operation
* @return {Array}            The resulting array
* @author Victor N. www.vitim.us
*/
function operateArrays(arrayA, arrayB, fn){
    if(arrayA.length!==arrayB.length) throw new Error("Cannot operate arrays of different lengths");
    return arrayB.map(function(b, i){
        return fn(arrayA[i], b);
    });
}

答案 11 :(得分:1)

使用ES6 .reduce()的单行解决方案:

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

答案 12 :(得分:0)

var arr = [1,2,3,4];
var arr2 = [1,1,1,2];

您可以使用:

var squares = arr.concat(arr2).reduce((t,n)=>t+n);

或:

var squares = arr.map((a, i) => a + arr2[i]).reduce((t,n) => t+n);

console.log(squares);

答案 13 :(得分:0)

这里有3个功能都可以完成相同的事情。按照现代JavaScript语法的顺序列出它们。

第一个功能使用了从一开始就存在的基本语言功能。这将适用于真正的旧浏览器,例如IE6。

第二个功能使用了2009年左右推出的ECMASScript 5中的功能,并将在IE9 +上运行。

第三个函数使用ECMASScript 2015箭头函数,并且不能在任何版本的IE(甚至是IE 11)上运行,除非您在代码中使用某种类型的构建步骤来转换为Babel或Typescript之类的ES5

/**
 * Multiplies the corresponding values of two arrays and then sums the product.
 * Supported in all legacy browsers
 * @param {number[]} arr1 The first array
 * @param {number[]} arr2 The second array
 **/
function sumOfProductsECMAScript4(arr1, arr2) {
    var total = 0;
    for(var i = 0; i < arr1.length; i += 1) {
        total += arr1[i] * arr2[i];
    }
}

/**
 * Multiplies the corresponding values of two arrays and then sums the product.
 * Supported in all mainstream browsers except IE 8 and older.
 * @param {number[]} arr1 The first array
 * @param {number[]} arr2 The second array
 **/
function sumOfProductsECMASScript5(arr1, arr2) {
    // The map function creates a new array of the product of arr1 and arr2 values
    // The reduce function then takes this array of products and adds up all the values
    return arr1
        .map(function (value, index) { return value * arr2[index]; })
        .reduce(function (sum, current) { return sum + current; }, 0);
}

/**
 * Multiplies the corresponding values of two arrays and then sums the product.
 * Supported in all mainstream browsers except IE.
 * @param {number[]} arr1 The first array
 * @param {number[]} arr2 The second array
 **/
function sumOfProductsECMASScript2015(arr1, arr2) {
    // The map function creates a new array of the product of arr1 and arr2 values
    // The reduce function then takes this array of products and adds up all the values
    return arr1
        .map((v, i) => v * arr2[i])
        .reduce((sum, v) => sum + v, 0);
}



// Define your arrays
let arr1 = [2,3,4,5];
let arr2 = [4,3,3,1];

// Usage
let answer = sumOfProductsECMASScript4(arr1, arr2);
let answer2 = sumOfProductsECMASScript5(arr1, arr2);
let answer3 = sumOfProductsECMASScript2015(arr1, arr2);

答案 14 :(得分:0)

如果您正在做大量此类事情,则可能会使用mathjs之类的库:

var arr1 = [2,3,4,5];
var arr2 = [4,3,3,1];
result=math.dot(arr1,arr2);

答案 15 :(得分:0)

使其映射并缩小

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

var result = arr1.map((v,i) => v * arr2[i]).reduce((x, y) => x + y, 0)

console.log(result)