javascript将多维数组值添加到新数组

时间:2014-08-25 02:52:30

标签: javascript lodash

我有一个像

这样的多维数组
var arr = [[1,2,3],[1,3,2],[1,1,1]];

我希望将每列的矩阵列添加到一个新数组中。我期望的结果是[3,6,6]。这是我提出的解决方案

function compute(arr) {
    var X = _.reduce(arr, function(acc, j) {
        acc += j[0];
        return acc;
    },0);
    var Y = _.reduce(arr, function(acc, k) {
        acc += k[1];
        return acc;
    },0);
    var Z = _.reduce(arr, function(acc, l) {
        acc += l[2];
        return acc;
    },0);
    return [X,Y,Z];
}

它有效,但似乎有3个减少功能。我正在寻找使用lodash的更清洁,功能更强,更快速的解决方案。

我想也许我可以使用_.flatten函数,因为你可以为每次迭代传递一个函数,但我似乎无法避免所有的循环。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

您可以在函数内声明一个处理索引和数组的函数:

function compute(arr) {

    var reduce = function (index) {
        return _.reduce(arr, function(acc, array) {
            acc += array[index];
            return acc;
        },0);
    }

    var X = reduce(0);
    var Y = reduce(1);
    var Z = reduce(2);

    return [X,Y,Z];
};

如果你想缩短一点,你也可以这样做:

function compute(arr) {
    var reduce = function (index) {
        return _.reduce(arr, function(acc, array) {
            acc += array[index];
            return acc;
        },0);
    }

    return [reduce(0), reduce(1), reduce(2)];
};

如果你想让它更短,你也可以这样做。这个功能更有用,因为你将函数作为参数传递给_.map

function compute(arr) {
    var reduce = function (index) {
        return _.reduce(arr, function(acc, array) {
            acc += array[index];
            return acc;
        },0);
    }
    return _.map([0, 1, 2], reduce);
};

您可以在此处查看结果:http://jsfiddle.net/thejsj/p33hmc8q/

答案 1 :(得分:1)

使用香草避免内在的简单方法:

var arr = [[1,2,3],[1,3,2],[1,1,1]];

function sum(a,b){return a+b;}
function pluck(a){return a[this];}


arr.map(function(a,b,c){
   return c.map(pluck,b).reduce(sum);
}); // == [3, 6, 6]

在下划线/ lodash中相同:

var arr = [[1,2,3],[1,3,2],[1,1,1]];   

function sum(a,b){return a+b;}

_.map(arr, function(a,b,c){
  return _.reduce(_.pluck(c, b), sum);
}); // == [3, 6, 6]
个人而言,我喜欢Array方法的本地链接,所以我不需要平衡parens,但无论哪种方式都有效。

使用不同的低级可互换部件比使用一个大程序更好,这样您就可以减少,重复使用和回收键击,因为您发现自己需要在以后再次执行几乎相同的操作。