使用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: [{...}]}
分组是正确的,但我真的想添加我想要的密钥( color
, users
)。 这是可能的使用_.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');
这里是更新的提琴手;
这里是使用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();