基于数组元素的连接

时间:2014-03-27 15:28:44

标签: arrays node.js underscore.js

我使用http://underscorejs.org/

问题如下,我有许多数组,其元素是数组, 例如

array1 = [[1,2],[1,3],[4,5]]
array2 = [[2],[4,6]]

问题是我想按元素加入数组,如下面的

array3 = array1 join array2
array3 = [[1,2],[1,3,4,6],[4,5]]

是否有任何优雅的方式可以使用下划线进行基于元素的连接。

2 个答案:

答案 0 :(得分:2)

console.log(_.map(_.zip(array1, array2), function(item) {
    return _.uniq(_.flatten(_.compact(item), true));
}));
// [ [ 1, 2 ], [ 1, 3, 4, 6 ], [ 4, 5 ] ]

一步一步说明:

console.log(_.zip(array1, array2));
/*[ [ [ 1, 2 ], [ 2 ] ],
    [ [ 1, 3 ], [ 4, 6 ] ],
    [ [ 4, 5 ], undefined ] ]*/

我们对列表中的每个项目应用_.uniq(_.flatten(_.compact(item), true))

  1. 首先_.compact将应用于这些项目。这很重要,因为我们必须在最后一个元素中删除undefined

  2. 然后我们_.flatten数组,以便[ 1, 2 ], [ 2 ]成为[ 1, 2, 2 ]

  3. 然后我们只采用独特的元素。因此输出变为[1, 2]

  4. 修改:实际上,如果你喜欢单行,你可以做到

    _.map(_.zip(array1, array2), _.compose(_.uniq, _.flatten, _.compact));
    // [ [ 1, 2 ], [ 1, 3, 4, 6 ], [ 4, 5 ] ]
    

答案 1 :(得分:1)

您正在寻找join = zipWith concat: - )

使用下划线,您可以写

array3 = _.map(_.zip(array1, array2), function(els) {
    return _.flatten(_.compact(els), true)
    // or just: els[0].concat(els[1] || []);
});