基于数组元素的连接

我使用http://underscorejs.org/ 。

问题是下面,我有一些数组,其元素是数组,例如

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

问题是我想通过元素来join数组,如下所示

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

是否有任何优雅的方式与基于元素的join下划线。

 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 ] _.flatten [ 1, 2, 2 ]

  3. 那么我们只采取独特的元素。 所以输出变成[1, 2]

编辑:其实,如果你喜欢单行,你可以做

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

你正在寻找join = zipWith concat 🙂

下划线,你会写

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