Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

353
Views
Javascript, ¿cómo transformar esta matriz en diccionario?

¿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);

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

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>

about 4 years ago · Juan Pablo Isaza Report

0

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);

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!