javascript - multiple - usando lodash.groupBy. cómo agregar sus propias claves para salida agrupada?
lodash object to array (9)
¿No es así de simple?
var result = _(data)
.groupBy(x => x.color)
.map((value, key) => ({color: key, users: value}))
.value();
Tengo estos datos de muestra devueltos por una API.
Estoy usando _.groupBy de _.groupBy
para convertir los datos en un objeto que puedo usar mejor. Los datos brutos devueltos son los siguientes:
[
{
"name": "jim",
"color": "blue",
"age": "22"
},
{
"name": "Sam",
"color": "blue",
"age": "33"
},
{
"name": "eddie",
"color": "green",
"age": "77"
}
]
Quiero que la función _.groupBy
devuelva un objeto que se ve así:
[
{
color: "blue",
users: [
{
"name": "jim",
"color": "blue",
"age": "22"
},
{
"name": "Sam",
"color": "blue",
"age": "33"
}
]
},
{
color: "green",
users: [
{
"name": "eddie",
"color": "green",
"age": "77"
}
]
}
]
Actualmente estoy usando
_.groupBy(a, function(b) { return b.color})
que está devolviendo esto.
{blue: [{..}], green: [{...}]}
las agrupaciones son correctas, pero realmente me gustaría agregar las claves que quiero ( color
, users
). ¿Es esto posible usando _.groupBy
? o alguna otra utilidad LoDash
?
Aquí hay una versión actualizada que usa lodash 4 y ES6
const result = _.chain(data)
.groupBy("color")
.toPairs()
.map(pair => _.zipObject([''color'', ''users''], pair))
.value();
Gracias a @thefourtheye , tu código fue de gran ayuda. Creé una función genérica a partir de su solución utilizando la versión 4.5.0 de Lodash.
function groupBy(dataToGroupOn, fieldNameToGroupOn, fieldNameForGroupName, fieldNameForChildren) {
var result = _.chain(dataToGroupOn)
.groupBy(fieldNameToGroupOn)
.toPairs()
.map(function (currentItem) {
return _.zipObject([fieldNameForGroupName, fieldNameForChildren], currentItem);
})
.value();
return result;
}
Para usarlo:
var result = groupBy(data, ''color'', ''colorId'', ''users'');
Aquí está el violín actualizado;
La respuesta más votada utiliza la función Lodash _.chain
, que se considera una mala práctica ahora "Por qué usar _.chain
es un error".
A continuación, presentamos algunas ideas que abordan el problema desde la perspectiva de la programación funcional :
import tap from "lodash/fp/tap";
import flow from "lodash/fp/flow";
import groupBy from "lodash/fp/groupBy";
const map = require(''lodash/fp/map'').convert({ ''cap'': false });
const result = flow(
groupBy(''color''),
map((users, color) => ({color, users})),
tap(console.log)
)(input)
Donde la input
es una matriz que desea convertir.
Puedes hacerlo así
var result = _.chain(data)
.groupBy("color")
.pairs()
.map(function(currentItem) {
return _.object(_.zip(["color", "users"], currentItem));
})
.value();
console.log(result);
Nota: Lodash 4.0 en adelante, la función .pairs
ha sido renombrada a _.toPairs()
Sugeriría un enfoque diferente, usando mi propia biblioteca podría hacer esto en unas pocas líneas:
var groupMe = sequence(
groupBy(pluck(''color'')),
forOwn(function(acc, k, v) {
acc.push({colors: k, users: v});
return acc;
},[])
);
var result = groupMe(collection);
Esto sería un poco difícil con lodash o Underscore porque los argumentos están en el orden de orden opuesto, por lo que tendría que usar _.partial
mucho.
de otra manera
_.chain(data)
.groupBy(''color'')
.map((users, color) => ({ users, color }))
.value();
Ejemplo groupBy y suma de una columna usando 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);
En 2017 hazlo
_.chain(data)
.groupBy("color")
.toPairs()
.map(item => _.zipObject(["color", "users"], item))
.value();