tengo estos datos:
const entities = [ { id: 'view_1', group: { id: 'g_1', name: 'Group 1' } }, { id: 'view_2', group: { id: 'g_2', name: 'Group 2' } }, { id: 'view_3', group: { id: 'g_2', name: 'Group 2' } }, ];Y necesito obtener esto como salida:
const groupedEntities = [ { id: 'g_1', name: 'Group 1', views: [{ id: 'view_1' }] }, { id: 'g_2', name: 'Group 2', views: [{ id: 'view_3' }, { id: 'view_3' }] }, ]; Sé que hay indexBy en ramda pero no conserva otros datos además de la clave. Lo que necesito es conservar todos los datos y devolver un objeto.
GroupBy de groupBy puede ayudarlo aquí:
const transform = pipe ( groupBy (path (['group', 'id'])), values, map (applySpec ({ group: path ([0, 'group', 'id']), name: path ([0, 'group', 'name']), views: pluck ('id') })) ) const entities = [{id: 'view_1', group: { id: 'g_1', name: 'Group 1'}}, {id: 'view_2', group: { id: 'g_2', name: 'Group 2'}}, {id: 'view_3', group: { id: 'g_2', name: 'Group 2'}}] console .log (transform (entities)) .as-console-wrapper {max-height: 100% !important; top: 0} <script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js"></script> <script>const {pipe, groupBy, path, values, map, applySpec, pluck} = R</script>El resto es un poco más complicado debido a la necesidad de extraer partes del primer elemento de cada grupo y partes del grupo completo, pero en general, no está tan mal: