使用lodash

时间:2015-06-18 08:57:41

标签: javascript collections lodash

  • 我有一个集合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:两个集合共有的元素具有相同的顺序

1 个答案:

答案 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));