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.

-1
Victoria Unizhona 27 ago. 2020 a las 13:42

4 respuestas

La mejor respuesta

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);
2
domenikk 27 ago. 2020 a las 10:52

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

1
Kamran Khatti 27 ago. 2020 a las 11:09

¡@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>
0
Ivan Burnaev 27 ago. 2020 a las 11:01

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;
}, []);
1
ritaj 27 ago. 2020 a las 11:06
63614307