我可以使用array.prototype.reduce()一次处理两个数组吗?

时间:2017-06-06 21:26:07

标签: javascript arrays

我有两个相同长度的数组,我想以某种方式使用reduce方法同时处理它们。类似的东西:

var arr1 = [2, 3, 4, 5, 6];
var arr2 = [5, 10, 4, 9, 5];
var productSum = arr1.reduce(function(sumOfProducts, item, secondArrayItem) {
    /* here I would like to multiply item from arr1 by the item from arr2 at the same index */
    return sumOfProducts + item * secondArrayItem;  
}, 0, arr2)
console.log(productSum);  // 131

选项当然是使用arr2currentIndex访问正确的项目,但是当我访问函数范围之外的变量时,该解决方案很难看。

我的具体用例是我有一个包含var resources = [2, 5, 4, 6, 2]等资源的数组,我想检查每个项目是否高于另一个数组中相应的资源成本,如var cost = [3, 1, 0, 0, 1]

使用reduce()函数是否有一些很好的解决方案?

3 个答案:

答案 0 :(得分:2)

使用Ramda你可以先压缩两个列表,然后减少它并使用解构来提取数组元素并将它们作为参数传递给回调:



const reduceTwo = (callback, initialValue, arr1, arr2) =>
  R.reduce((acc, [x, y]) => callback(acc, x, y), initialValue, R.zip(arr1, arr2));

const arr1 = [2, 3, 4, 5, 6];
const arr2 = [5, 10, 4, 9, 5];
console.log(reduceTwo((acc, x, y) => acc + x * y, 0, arr1, arr2));

<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.24.1/ramda.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

我知道这样做的标准方法是将2个列表组合成相应对的列表(&#34;压缩&#34;),然后减少组合列表:

var zipped = zip(arr1, arr2)

reduce((acc, [x, y]) => (Use x and y), 
              zipped) 

有关zip的实施,请参阅this question.

(当我下班时会验证语法)

答案 2 :(得分:0)

您可以使用纯JS进行以下操作;

var arr1 = [2, 3, 4, 5, 6],
    arr2 = [5, 10, 4, 9, 5],
  result = arr1.reduce((r,c,i) => (r.sum = r.sum ? r.sum + c * r[i] : c * r[i], r), arr2.slice()).sum;
console.log(result);

.slice() arr2为了不使用状态变量对其进行变更,但如果之后不将for in循环应用于arr2,您仍可以不进行切片或者这样......