How to add the values in one array to those in another pair-wise?
如何将数组的等号索引的值添加到另一个数组中?
我知道我可以这样做:
1 2 3 4 5 6 7 8 9 10 11 | var i = 0, a = [1, 2, 3], b = [4, 5, 6], total = []; while (i < a.length) { total[i] = a[i] + b[i]; i = i + 1; } console.log(total); //[5, 7, 9] |
但是,有没有一种标准的或更快的方法来做到这一点?
(在我的具体案例中,所有案例中都是
你可能会发现这个有点紧凑:
1 | a.map(function(v, i) { return v + b[i]; }) |
它将在ES6中更加紧凑:
1 | a.map((v, i) => v + b[i]) |
我们可以编写自己的
1 2 3 4 5 | function mapTwo(arr1, arr2, fn, ctxt) { return arr1.map(function(v, i) { return fn.call(ctxt, v, arr2[i], i); }; } |
现在我们可以用
1 | mapTwo(a, b, function(v1, v2) { return v1 + v2; })) |
或者,如果我们真的想这样做,让我们编写一个
1 2 3 4 5 6 | function mapMany(arrays, fn, ctxt) { fn = fn.bind(ctxt); return arrays[0].map(function(_, i) { return fn(arrays.map(function(array) { return array[i]; }), i); }; } |
现在我们可以做
1 | mapMany([a,b], sum); |
其中
1 2 3 | function sum(values) { return values.reduce(function(result, val) { return result+val; }); } |
我们还可以编写一个更通用的函数,叫做
1 2 3 4 5 6 7 8 | function zip(arrays) { var result = [], max = Math.max.apply(0, arrays.map(function(array) { return array.length; })); for (var i=0; i<max; i++) { result.push(arrays.map(function(array) { return array[i]; }); } return result; } |
现在我们可以用
1 | zip([a,b]).map(sum) |
不,没有真正的"标准"方法。也许像罗达什这样的图书馆可以帮助你。具体来看一下.zip()函数