remove multiple from array javascript sorting underscore.js grouping lodash

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;

https://jsfiddle.net/sc2L9dby/


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

Demo en línea

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();