[英]Javascript: Multiply and Sum Two Arrays
我有兩個長度相等的數組,我需要將每個數組中相應的(按索引)值相乘,然后對結果求和。
例如
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
這顯示了用於計算兩個向量的點積的“功能”方法而不是“命令式”方法。 在 OP 要求的如此簡單的函數實現中,函數方法(往往更簡潔)是首選。
var sum = 0;
for(var i=0; i< arr1.length; i++) {
sum += arr1[i]*arr2[i];
}
其他答案幾乎肯定更有效,但只是為了給您一個遞歸的觀點(在其他一些語言中更好)。 它確實假設兩個數組的長度相等,因為您沒有指定如果它們不相同要做什么。
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);
在這里試試: 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))
像這樣的東西:
var sum = 0;
for (var i=0, len = arr1.length; i < len; i++) { // optimized looping
sum += arr1[i] * arr2[i];
}
這對我來說似乎很直接
var result=0;
for (var i=0; i<arr1.length;i++){
result+=arr1[i]*arr2[i];
}
聲明執行您想要的操作的函數。
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);
});
}
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);
使用 ES6 .reduce() 的單行解決方案:
const sum_products = arr1.reduce((sum, val, i) => sum + (val * arr2[i]), 0)
這里有 3 個函數,它們都完成相同的事情。 它們是按照越來越現代的 JavaScript 語法的順序列出的。
第一個函數使用從一開始就存在的基本語言特性。 這將適用於非常舊的瀏覽器,例如 IE6。
第二個函數使用了 2009 年左右推出的 ECMASScript 5 的功能,並將在 IE9+ 上運行。
第三個函數使用 ECMASScript 2015 箭頭函數,不適用於任何版本的 IE,甚至 IE 11 也不行,除非您在代碼中使用某種類型的構建步驟來轉換為 ES5,如 Babel 或 Typescript
/**
* 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);
如果你做了很多這類事情,你可能會使用像mathjs這樣的庫:
var arr1 = [2,3,4,5];
var arr2 = [4,3,3,1];
result=math.dot(arr1,arr2);
使其映射並減少
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.