使用lodash .groupBy。 如何为分组输出添加自己的密钥?

我有从API返回这个示例数据。

我正在使用Lodash的_.groupBy将数据转换成我可以更好地使用的对象。 返回的原始数据是这样的:

 [ { "name": "jim", "color": "blue", "age": "22" }, { "name": "Sam", "color": "blue", "age": "33" }, { "name": "eddie", "color": "green", "age": "77" } ] 

我想_.groupBy函数返回一个如下所示的对象:

 [ { color: "blue", users: [ { "name": "jim", "color": "blue", "age": "22" }, { "name": "Sam", "color": "blue", "age": "33" } ] }, { color: "green", users: [ { "name": "eddie", "color": "green", "age": "77" } ] } ] 

目前我正在使用

 _.groupBy(a, function(b) { return b.color}) 

这是返回这个。

 {blue: [{..}], green: [{...}]} 

分组是正确的,但我真的想添加我想要的密钥( colorusers )。 这是可能的使用_.groupBy ? 或者其他一些LoDash工具?

你可以这样做

 var result = _.chain(data) .groupBy("color") .pairs() .map(function(currentItem) { return _.object(_.zip(["color", "users"], currentItem)); }) .value(); console.log(result); 

在线演示

注意: Lodash 4.0以后, .pairs函数被重命名为_.toPairs()

这不简单吗?

 var result = _(data) .groupBy(x => x.color) .map((value, key) => ({color: key, users: value})) .value(); 

其他方式

 _.chain(data) .groupBy('color') .map(function(val, key) { return { color: key, users: val }; }) .value(); 

谢谢@thefourtheye ,你的代码很有帮助 。 我使用Lodash版本4.5.0从您的解决scheme创build了一个通用函数。

 function groupBy(dataToGroupOn, fieldNameToGroupOn, fieldNameForGroupName, fieldNameForChildren) { var result = _.chain(dataToGroupOn) .groupBy(fieldNameToGroupOn) .toPairs() .map(function (currentItem) { return _.zipObject([fieldNameForGroupName, fieldNameForChildren], currentItem); }) .value(); return result; } 

要使用它:

 var result = groupBy(data, 'color', 'colorId', 'users'); 

这里是更新的提琴手;

https://jsfiddle.net/sc2L9dby/

这里是使用lodash 4和ES6的更新版本

 const result = _.chain(data) .groupBy("color") .toPairs() .map(pair => _.zipObject(['color', 'users'], pair)) .value(); 

我会build议一个不同的方法,使用我自己的库,你可以做几行:

 var groupMe = sequence( groupBy(pluck('color')), forOwn(function(acc, k, v) { acc.push({colors: k, users: v}); return acc; },[]) ); var result = groupMe(collection); 

这与lodash或Underscore会有点困难,因为参数的顺序是相反的,所以你必须使用_.partial

示例组使用Lodash的列的总和和列4.17.4

  var data = [{ "name": "jim", "color": "blue", "amount": 22 }, { "name": "Sam", "color": "blue", "amount": 33 }, { "name": "eddie", "color": "green", "amount": 77 }]; var result = _(data) .groupBy(x => x.color) .map((value, key) => ({color: key, totalamount: _.sumBy(value,'amount'), users: value})).value(); console.log(result); 

在2017年这样做

 _.chain(data) .groupBy("color") .toPairs() .map(item => _.zipObject(["color", "users"], item)) .value();