考虑到我有阵列:
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);
答案 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;
答案 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()
来迭代。
用于确定分隔符的实际谓词作为参数传入,这意味着您可以将此函数重用于其他类型的分隔符。