基于数组元素的连接
我使用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))
。
-
首先
_.compact
将被应用在项目上。 这很重要,因为我们必须摆脱最后一个元素中的undefined
。 -
然后我们
_.flatten
数组,使[ 1, 2 ], [ 2 ]
,将变成[ 1, 2, 2 ]
_.flatten
[ 1, 2, 2 ]
-
那么我们只采取独特的元素。 所以输出变成
[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] || []); });