【问题标题】:How to add the values in one array to those in another pair-wise?如何将一个数组中的值成对添加到另一个数组中的值?
【发布时间】:2014-11-02 22:51:32
【问题描述】:

如何将一个数组的equals索引值添加到另一个数组?

我知道我可以这样做:

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 在所有情况下)。

【问题讨论】:

    标签: javascript sum


    【解决方案1】:

    您可能会发现这更紧凑:

    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)
    

    【讨论】:

      【解决方案2】:

      不,没有真正的“标准”方式来做到这一点。也许LoDash 的库可以在这里为您提供帮助。具体看一下.zip()函数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-04-30
        • 2012-03-24
        • 2020-10-06
        • 1970-01-01
        • 1970-01-01
        • 2022-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多