在Node.js中使用lodash将数组分成块

4
我有一个包含联系人的组,请看以下内容:

 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 )
})

这在客户端上运行良好,但在Node.js中却不行。下面是来自Node.js的输出

[["C1","C1....]]

数组未被分成块,而是作为单个数组出现。

预期数组应该是

[["C1","C1"....,"c50"],["C51","C1"....,"c100"]...]

我正在nodejs中使用lodash 4.17.4。请指导。

可能需要使用不同版本的lodash吗? - Lodewijk Bogaards
@LodewijkBogaards 我正在Node.js中使用lodash 4.17.4。 - mymotherland
1个回答

1
这一定与在浏览器中使用不同版本有关,因为如果您查看 Lodash 4.17.4 中的 groupBy 代码,您可以清楚地看到您传递的函数,即 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 历史记录,我并不惊讶其行为随时间改变。一段时间以前,它从使用一些通用的迭代器(可能包含索引)完全更改为了一些更简单的东西,显然不包括索引。

如果我是你,我会使用 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;
  }, [[]]);
}

感谢 @Lodewijk :) - mymotherland

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接