Tengo una matriz de ejemplo:
arr = [{id:1, count: 2}, {id: 2, count: 6}, {id: 2, count: 4}, {id: 1, count:4}]
Necesito transformarlo para incluir matrices con objetos dentro según la identificación:
[[{id:1, count: 2}, {id: 1, count:4}], [{id: 2, count: 6}, {id: 2, count: 4}]]
Si tendré 3 ID diferentes, entonces tendrá 3 matrices dentro y así sucesivamente.
Si conoce alguna buena solución, hágamelo saber. Lodash también podría estar bien.
4 respuestas
Puedes usar groupBy
de lodash para obtener un mapa como este:
{
'1': [{id:1, count: 2}, {id: 1, count:4}],
'2': [{id: 2, count: 6}, {id: 2, count: 4}]]
}
Luego puedes transformarlo en una matriz usando Object.values()
Básicamente necesitas estas dos líneas:
const groupedById = _.groupBy(items, item => item.id);
const result = Object.values(groupedById);
Como mencionó en su pregunta, la solución lodash también podría funcionar para usted, entonces loadash tiene un método listo para usar groupBy que puede lograr el resultado deseado.
import { groupBy } from "lodash";
const arr = [{id:1, count: 2}, {id: 2, count: 6}, {id: 2, count: 4}, {id: 1, count:4}]
const result = groupBy(arr, 'id');
console.log(result)
DEMO en funcionamiento
¡@domenikk mostró un muy buen ejemplo! Además, puede usar Ramda
en lugar de Lodash
para tener una función sin puntos =)
const arr = [
{id:1, count: 2},
{id: 2, count: 6},
{id: 2, count: 4},
{id: 1, count:4}
]
const groupById = R.compose(
R.values,
R.groupBy(R.prop('id'))
)
console.log(groupById(arr))
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
JS puro, con reduce
:
arr.reduce((acc, curr) => {
let existing = acc.findIndex(elem => elem.some(obj => obj.id === curr.id));
if (existing > -1) {
acc[existing].push(curr);
}
else {
acc[acc.length] = [curr]
}
return acc;
}, []);
Nuevas preguntas
javascript
Para preguntas sobre la programación en ECMAScript (JavaScript / JS) y sus diversos dialectos / implementaciones (excepto ActionScript). Incluya todas las etiquetas relevantes en su pregunta; por ejemplo, [node.js], [jquery], [json], etc.