¿Hay una forma elegante (¿mapa?) de transformar mi objeto de este
[ {id: 1, from: "1/1/2021", to: "1/2/2022"}, {id: 2, from: "1/3/2021", to: "1/4/2022"}, {id: 1, from: "1/5/2021", to: "1/6/2022"}, {id: 2, from: "1/6/2021", to: "1/7/2022"} ]a:
{ 1: [{from: "1/1/2021", to: "1/2/2022"}, {from: "1/5/2021", to: "1/6/2022"}], 2: [{from: "1/3/2021", to: "1/4/2022"}, {from: "1/6/2021", to: "1/7/2022"}] }Aquí está mi código:
const res = [ {id: 1, from: "1/1/2021", to: "1/2/2022"}, {id: 2, from: "1/3/2021", to: "1/4/2022"}, {id: 1, from: "1/5/2021", to: "1/6/2022"}, {id: 2, from: "1/6/2021", to: "1/7/2022"} ] let dict = {}; for(var i=0; i < res.length; i++) { dict[res[i].id] = dict[res[i].id] || []; dict[res[i].id].push({from:res[i].from, to:res[i].to}); } console.log(dict);Podría crear una función groupBy() para agrupar por cualquier propiedad, en este caso, id. Array.reduce() para convertir al objeto deseado.
Actualización: eliminé la property en sí, en este caso, la id de los grupos de matriz resultantes.
let input = [ {id: 1, from: "1/1/2021", to: "1/2/2022"}, {id: 2, from: "1/3/2021", to: "1/4/2022"}, {id: 1, from: "1/5/2021", to: "1/6/2022"}, {id: 2, from: "1/6/2021", to: "1/7/2022"} ]; function groupBy(arr, property) { return arr.reduce((acc, cur) => { const { [property]: _, ...obj} = cur; acc[cur[property]] = [...(acc[cur[property]] || []), obj]; return acc; }, {}) } console.log(groupBy(input, 'id')) .as-console-wrapper { max-height: 100% !important; top: 0; } <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>También puede usar lodash groupBy para este propósito, con un mínimo de código:
let input = [ {id: 1, from: "1/1/2021", to: "1/2/2022"}, {id: 2, from: "1/3/2021", to: "1/4/2022"}, {id: 1, from: "1/5/2021", to: "1/6/2022"}, {id: 2, from: "1/6/2021", to: "1/7/2022"} ]; console.log('groupBy (lodash):', _.groupBy(input, 'id')); .as-console-wrapper { max-height: 100% !important; top: 0; } <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"></script> Y, finalmente, también puede reduce uso de un objeto de Map :
let input = [ {id: 1, from: "1/1/2021", to: "1/2/2022"}, {id: 2, from: "1/3/2021", to: "1/4/2022"}, {id: 1, from: "1/5/2021", to: "1/6/2022"}, {id: 2, from: "1/6/2021", to: "1/7/2022"} ]; function groupBy(arr, property) { return Object.fromEntries(arr.reduce((acc, cur) => { return acc.set(cur[property], [...(acc.get(cur[property]) || []), cur]); }, new Map())) } console.log(groupBy(input, 'id')) .as-console-wrapper { max-height: 100% !important; top: 0; } <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>Array.reduce() puede resolver su problema.
const res = [ {id: 1, from: "1/1/2021", to: "1/2/2022"}, {id: 2, from: "1/3/2021", to: "1/4/2022"}, {id: 1, from: "1/5/2021", to: "1/6/2022"}, {id: 2, from: "1/6/2021", to: "1/7/2022"} ]; var result = res.reduce(function(acc, {id, from, to}) { (acc[id] = acc[id] || []).push({from, to}); return acc; }, {}); console.log(result);