Lodash:如何使用某个分隔符对象拆分对象数组

时间:2016-09-01 13:09:07

标签: arrays split lodash

考虑到我有阵列:

var arr = [
   {type:'a', name:'a1'}, {type:'b', name:'b1'}, {type:'hr'}, 
   {type:'a', name:'a2'}, {type:'b', name:'b2'}, {type:'hr'}, 
   {type:'a', name:'a3'}, {type:'b', name:'b2'}, {type:'hr'} 
]

我使用{type:'hr'}对象作为分隔符元素将其拆分为对象数组数组。结果是:

[
[{type:'a', name:'a1'}, {type:'b', name:'b1'}],
[{type:'a', name:'a3'}, {type:'b', name:'b2'}],
[{type:'a', name:'a3'}, {type:'b', name:'b3'}]
]

认为lodash对它有用吗?

目前,我已使用_.map

 var result = [], sub = [];                                                                                                                                    _.map(tokens, (it, idx) => {                                                                                                                                      if(it.type === 'hr'){                                                     
        result.push(sub);                                                 
                sub = [];                                                 
            } else {                                                      
                sub.push(it);                                             
            }                                                             
        });                                                               
        if(sub.length){                                                   
            result.push(sub);                                             
        }                                                                 
    console.log(result);  

2 个答案:

答案 0 :(得分:2)

当您找到{type:'hr'}时,可以使用reduce并创建新的子数组:



var arr = [
   {type:'a', name:'a1'}, {type:'b', name:'b1'}, {type:'hr'}, 
   {type:'a', name:'a2'}, {type:'b', name:'b2'}, {type:'hr'}, 
   {type:'a', name:'a3'}, {type:'b', name:'b2'}, {type:'hr'} 
];
var delimiter = { type: 'hr' };
var res = _.reduce(arr, function(result, obj, index) {
  if (_.isEqual(obj, delimiter)) {
    if (index !== arr.length - 1) result.push([]);
  } else {
    _.last(result).push(obj);
  }
  return result;
}, [[]]);

console.log(res);

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.15.0/lodash.min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分:1)

这就是我要做的事情:

function splitBy(array, predicate, result = []) {
  const taken = _.takeWhile(array, predicate);
  const remaining = _.tail(_.dropWhile(array, predicate));

  return remaining.length ?
    splitBy(remaining, predicate, result.concat([taken])) :
    result.concat([taken]);
}

splitBy(
  arr,
  _.negate(_.partial(_.isEqual, { type: 'hr' })))
);

我们的想法是使用takeWhile()来获取与分隔符不匹配的项目。然后,dropWhile()创建下一个数组块,通过将其传递给splitBy()来迭代。

用于确定分隔符的实际谓词作为参数传入,这意味着您可以将此函数重用于其他类型的分隔符。