10

我需要按元素添加几个数组。也就是说,我有几个长度相等的数组,我只需要一个具有相同数量的元素,即输入之和。Underscore 具有将所有元素折叠为一个并使用函数映射每个元素的方法,但我找不到任何方法将两个数组分段组合。

如果我原来的数组是[1,2,3,4,5,6][1,1,1,1,1,1]结果[2,2,2,2,2,2]应该是[4,5,6,7,8,9]

我知道我可以通过遍历数组来做到这一点,但想知道使用 underscore.js 函数是否会更容易/更快。我可以做吗?如何?

4

5 回答 5

11

更容易是,更快不是。要模拟 a zipWith,您可以将 azip与 sum-结合使用reduce

var arrays = [[1,2,3,4,5,6], [1,1,1,1,1,1], [2,2,2,2,2,2]];

_.map(_.zip.apply(_, arrays), function(pieces) {
     return _.reduce(pieces, function(m, p) {return m+p;}, 0);
});
于 2013-02-27T09:29:33.900 回答
5

我认为使用下划线不会更容易。这里有两个选项:

var a = [1,2,3,4,5,6]
  , b = [1,1,1,1,1,1]
  , c = [2,2,2,2,2,2];

var result = a.map(function(_,i) {
  return a[i] + b[i] + c[i];
});

// OR

var result = [];
for (var i = 0; i < a.length; i++) {
  result.push(a[i] + b[i] + c[i]);
}

console.log(result); //=> [4,5,6,7,8,9]
于 2013-02-27T09:26:30.517 回答
4

您可以使用 lodash ( https://lodash.com/ ) 而不是下划线,它有一个非常酷的 zipWith ( https://lodash.com/docs#zipWith ) 运算符,可以像下面的示例一样工作。(注意 _.add 也是一个 lodash 数学函数)

var a = [1,2,3,4,5,6]
  , b = [1,1,1,1,1,1]
  , c = [2,2,2,2,2,2];

var result = _.zipWith(a, b, c, _.add);

// result = [4, 5, 6, 7, 8, 9]
于 2015-05-13T19:49:29.747 回答
0

您可以将 zip 与 map 和 reduce 结合使用:未经测试,但类似的方法可能有效

var result = _.map(_.zip(array1, array2, array3),function(zipped){return _.reduce(zipped,  function(memo, num){ return memo + num; }, 0)});
于 2013-02-27T09:29:49.033 回答
0

使用Lodash 4

var arrays = [
  [1, 2, 3, 4, 5, 6],
  [1, 1, 1, 1, 1, 1],
  [2, 2, 2, 2, 2, 2]
];

var result = _.map(_.unzip(arrays), _.sum);
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

于 2018-11-14T13:37:40.820 回答