"Segmentize" collection 与 lodash

"Segmentize" collection with lodash

为了简洁起见,我想使用 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));