"Segmentize" collection 与 lodash
"Segmentize" collection with lodash
我有一个collectioncol1
var col1 = [1, 8, 9, 10, 2, 54, 7];
我还有一个collectioncol2
var col2 = [1, 8, 23, 9, 46, 10, 2, 54, 78, 7]
...我知道它包含 col1
的每个元素,加上一些其他元素
我想得到这个:
var col3 = [
[1, 8],
[9],
[10, 2, 54],
[7]
]
col1
"splitted", "segmentized" 来自 col2
为了简洁起见,我想使用 lodash 函数,但如果有人以 vanilla JS 的形式提供答案,我会接受答案,并将其转换为 lodash 作为编辑。
注意:我在 SO 上使用整数来提高可读性,但我的真实 collection 包含 objects.
NB2:每个元素在 collections
中都是唯一的
NB3:两个 collection 共有的元素顺序相同
我认为简单的 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));
我有一个collection
col1
var col1 = [1, 8, 9, 10, 2, 54, 7];
我还有一个collection
col2
var col2 = [1, 8, 23, 9, 46, 10, 2, 54, 78, 7]
...我知道它包含
col1
的每个元素,加上一些其他元素我想得到这个:
var col3 = [ [1, 8], [9], [10, 2, 54], [7] ]
col1
"splitted", "segmentized" 来自col2
为了简洁起见,我想使用 lodash 函数,但如果有人以 vanilla JS 的形式提供答案,我会接受答案,并将其转换为 lodash 作为编辑。
注意:我在 SO 上使用整数来提高可读性,但我的真实 collection 包含 objects.
NB2:每个元素在 collections
中都是唯一的
NB3:两个 collection 共有的元素顺序相同
我认为简单的 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));