关于javascript:如何将一个数组中的值添加到另一个数组中?

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]

但是,有没有一种标准的或更快的方法来做到这一点?

(在我的具体案例中,所有案例中都是a.length === b.length)。


你可能会发现这个有点紧凑:

1
a.map(function(v, i) { return v + b[i]; })

它将在ES6中更加紧凑:

1
a.map((v, i) => v + b[i])

我们可以编写自己的map版本,它在两个数组上并行循环:

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

或者,如果我们真的想这样做,让我们编写一个map,它在许多数组上迭代。它将使用一个值数组调用回调,每个值数组中有一个值。

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

其中sum

1
2
3
function sum(values) {
    return values.reduce(function(result, val) { return result+val; });
}

我们还可以编写一个更通用的函数,叫做zip,它将输入数组中每个索引处的元素组合到一个数组中,从而返回一个数组数组。我们现在将处理数组长度不同的情况;

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()函数