如何将一个数组的等于索引的值添加到另一个数组?
我知道我可以做这样的事情:
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]
但是,有没有一种标准或更快的方式来做到这一点?
(在我的具体情况下,a.length === b.length
在所有情况下)。
您可能会发现它更紧凑:
a.map(function(v, i) { return v + b[i]; })
在ES6中它将更加紧凑:
a.map((v, i) => v + b[i])
我们可以编写自己的版本,map
该版本在两个数组上并行循环:
function mapTwo(arr1, arr2, fn, ctxt) {
return arr1.map(function(v, i) {
return fn.call(ctxt, v, arr2[i], i);
};
}
现在我们可以解决原始问题
mapTwo(a, b, function(v1, v2) { return v1 + v2; }))
或者,如果我们真的想要,让我们编写一个map
对许多数组进行迭代的对象。它将使用一组值(每个输入数组中的一个)调用回调。
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);
};
}
现在我们可以做
mapMany([a,b], sum);
这里sum
是
function sum(values) {
return values.reduce(function(result, val) { return result+val; });
}
我们还可以编写一个更通用的函数,zip
将输入数组中每个索引处的元素组合到一个数组中,从而返回一个数组数组。现在,我们将处理数组长度不同的情况。
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;
}
现在我们可以用
zip([a,b]).map(sum)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句