Mis datos:
[{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }, { id: 1, name: 'foo' } ];Quiero hacer algo como esto:
[ { name: "foo", id: 1, count: 2 }, { name: "bar", id: 2, count: 1 } ] Ahora estoy agrupando los elementos con groupBy por nombre.
¡Gracias por la ayuda!
var source = [{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }, { id: 1, name: 'foo' } ]; var result = _(source) .groupBy('name') .map(function(items, name) { return { name: name, count: items.length } }).value(); console.log(result); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>No es exactamente lo que pediste, pero aquí hay un método simple sin usar lodash. Aquí estoy usando la ID de cada elemento, pero puede usar cualquier cosa que lo identifique de manera única.
const objArray = [{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }, { id: 1, name: 'foo' } ]; const reduceAndCount = (arr) => { const newMap = {}; arr.forEach(el => { if (!newMap[el.id]) { el.count = 1 return newMap[el.id] = el } newMap[el.id].count = newMap[el.id].count + 1 }) return Object.values(newMap) } const result = reduceAndCount(objArray) console.log(result)Con deferencia a la respuesta proporcionada aquí que usa 'lodash', como se solicita en la pregunta anterior, se observan los siguientes puntos:
EDITAR : Agregar solución usando lodash,
const arrayRaw = [{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }, { id: 1, name: 'foo' }]; const groupBy = (col = 'name', arr = arrayRaw) => ( _(arr).groupBy(col).map(it => ({ ...it[0], count: it.length })).value() ); console.log(groupBy()); <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/1.2.1/lodash.min.js"></script>En caso de que alguien requiera una solución sin 'lodash', la siguiente debería ser una posible implementación:
const arrayRaw = [{ id: 1, name: 'foo' }, { id: 2, name: 'bar' }, { id: 1, name: 'foo' }]; const groupBy = (col = 'name', arr = arrayRaw) => ( Object.entries(arr.reduce((fin, itm, idx) => ({ ...fin, [itm[col]]: (fin[itm[col]] || []).concat([idx]) }), {})).map(([k, v]) => ({ ...arr[v[0]], count: v.length })) ); console.log(groupBy());Enfoque / Explicación Se explica por sí mismo, sin embargo, si alguien necesita uno, comente y agregaré.