El siguiente código produce el resultado deseado, pero ¿hay una forma más concisa de escribirlo? es decir. enfoques de una línea
const data = [ { id: '385/72/21', month: 4 }, { id: '385/72/21', month: 7 }, { id: '385/72/21', month: 8 }, { id: '385/72/21', month: 10 }, { id: '461/80/07', month: 1 }, { id: '461/80/07', month: 5 }, { id: '461/80/07', month: 9 } ]; const accumulator = Object.assign({}, ...data.map(o => ({ [o.id]: [] }))) data.forEach(o => accumulator[o.id].push(o.month)); console.log(accumulator); const data = [ { id: '385/72/21', month: 4 }, { id: '385/72/21', month: 7 }, { id: '385/72/21', month: 8 }, { id: '385/72/21', month: 10 }, { id: '461/80/07', month: 1 }, { id: '461/80/07', month: 5 }, { id: '461/80/07', month: 9 } ]; const result = data.reduce((accu, curr) => { accu[curr.id] = Array.isArray(accu[curr.id]) ? [...accu[curr.id], curr.month] : [curr.month]; return accu; }, {}); console.log(result);Prefiero usar el operador de coma en lugar de extenderse una y otra vez (dependiendo de su conjunto de datos, puede incurrir en una penalización de rendimiento ):
console.log( data.reduce((acc, {id, month}) => (acc[id] ??= [], acc[id].push(month), acc), {}) ); <script> const data = [ { id: '385/72/21', month: 4 }, { id: '385/72/21', month: 7 }, { id: '385/72/21', month: 8 }, { id: '385/72/21', month: 10 }, { id: '461/80/07', month: 1 }, { id: '461/80/07', month: 5 }, { id: '461/80/07', month: 9 } ]; </script>Otra forma de usar Array.reduce() para obtener el resultado requerido:
const data = [ { id: '385/72/21', month: 4 }, { id: '385/72/21', month: 7 }, { id: '385/72/21', month: 8 }, { id: '385/72/21', month: 10 }, { id: '461/80/07', month: 1 }, { id: '461/80/07', month: 5 }, { id: '461/80/07', month: 9 } ]; const result = data.reduce((acc, { id, month}) => ({ ...acc, [id]: [ ...(acc[id] || []), month ] }), {}) console.log(result) .as-console-wrapper { max-height: 100% !important; top: 0; }