2014-03-27 52 views
1

我使用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
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]

编辑:其实,如果你喜欢的俏皮话,你可以做

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

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

以下划线,你会一步说明写

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

可以使这个有点用'partial'更短:使用'_。作为迭代器的部分(_。flatten,_,true)'。 –

+0

@AaronDufour:我知道,但我认为这可能太令人困惑了|编辑:它不会工作:-( – Bergi