我有以下小组与联系人
var groups = {"GROUP":[{'G1: [C1,C2,C3........C500000]},
{'G2': [C1,C2,C3........C500000,D1,D2,D3........D500000]}
.....]
}
现在我使用lodash将javascript数组拆分为n个大小的块,如下所示
_.each(groups,function(group){
var n = 50;
var lists = _.groupBy(group, function(element, index){
return Math.floor(index/n);
});
lists = _.toArray(lists );
console.log(lists )
})
这在客户端工作正常,但在nodejs中没有.节点js的输出如下
[["C1","C1....]]
数组不会拆分为块,而是以单个数组形式出现.
应该是预期的数组
[["C1","C1"....,"c50"],["C51","C1"....,"c100"]...]
我在nodejs中使用lodash 4.17.4.请指教
最佳答案 这必须与在浏览器中使用不同版本而不是在节点中有关,因为如果你查看
groupBy in Lodash 4.17.4的代码,你可以清楚地看到你传入的函数,iteratee,只用一个参数调用,即键,而不是键和索引:
function groupBy(collection, iteratee) {
return reduce(collection, (result, value, key) => {
key = iteratee(value) // <- no index here
if (hasOwnProperty.call(result, key)) {
result[key].push(value)
} else {
baseAssignValue(result, key, [value])
}
return result
}, {})
}
看看groupBy.js的所有git历史,我对这种行为随着时间的推移而发生变化并不感到惊讶.前段时间它完全从使用一些通用的iteratee(可能包括索引)改为更简单的东西,显然不包括索引.
如果我是你,我会用reduce语句实现这种分块行为:
function chunkArray(array, chunkSize) {
return _.reduce(array, function(result, value) {
var lastChunk = result[result.length-1];
if (lastChunk.length < chunkSize) lastChunk.push(value);
else result.push([value]);
return result;
}, [[]]);
}