我有一个集合col1
var col1 = [1, 8, 9, 10, 2, 54, 7];
我有另一个集合col2
var col2 = [1, 8, 23, 9, 46, 10, 2, 54, 78, 7]
...我知道它包含col1
的每个元素,加上其他一些元素
我想获得这个:
var col3 = [
[1, 8],
[9],
[10, 2, 54],
[7]
]
col1
“分裂”,“{分离”,col2
我想使用 lodash 函数来提供简洁,但如果有人将答案作为vanilla JS,我会接受答案,然后将其引入 lodash 作为编辑。
注意:我在SO上使用整数来表示可读性,但我的真实集合包含对象 NB2:每个元素在两个集合中都是唯一的 NB3:两个集合共有的元素具有相同的顺序
答案 0 :(得分:1)
我认为简单的Javascript算法会更短,更快,更容易理解:
var l = [],
col3 = [l],
i = 0;
for (var j=0; j<col2.length; j++)
if (col1[i] == col2[j])
l.push(col1[i++]);
else
col3.push(l = []);
同样的事情,不那么简洁,使用lodash循环:
var col1Pointer = 0;
var segment = [];
var col3 = [];
col3.push(segment);
_.foreach(col2, function(col2Item) {
var col1Item = col1[col1Pointer];
if (col1Item == col2Item) {
col1Pointer++;
segment.push(col1Item);
} else {
segment = [];
col3.push(segment);
}
});
我无法想到一种适当的纯粹的lodash方式 - 没有合适的方法。但我们可以自己写一个:
_.mixin({
splitOn: function(arr, callback, thisArg) {
if (!arr.length) return [];
callback = _.callback(callbac, thisArg);
var seg = [],
res = [seg];
for (var i=0; i<arr.length; i++)
if (callback(arr[i], i, arr))
res.push(seg = [])
else
seg.push(arr[i]);
return res;
}
});
然后像
一样使用它var col3 = _.splitOn(col2, _.ary(_.partial(_.includes, col1), 1));