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

103
Views
Javascript ordenar objeto por clave dentro de objetos anidados

Tengo el siguiente objeto:

 { 4: { 1: [ { order: 1, name: 'Test 4' } ] }, 0: { 15: [ { order: 7, name: 'Test 1' }, { order: 3, name: 'Test 3' }, ], 12: { { order: 1, name: 'Test 2' } } } }

Esencialmente, lo que estoy tratando de lograr es ordenar esto por las claves y luego ordenar más por la propiedad de orden desde el valor anidado. Entonces, a su vez, obtengo el siguiente resultado:

 { 0: { 12: { { order: 1, name: 'Test 2' } }, 15: [ { order: 3, name: 'Test 3' }, { order: 7, name: 'Test 1' }, ] }, 4: { 1: [ { order: 1, name: 'Test 4' } ] } }

Luego quiero aplanar esto por completo para que no tenga ningún objeto externo y solo los datos dentro de la orden, el resultado sería:

 [ { name: 'Test 2' }, { name: 'Test 3' }, { name: 'Test 1' }, { name: 'Test 4' } ]

Me imagino que esto sería algún tipo de operación recursiva que necesito hacer y originalmente lo hice con algo como lo siguiente, pero se puso un poco complicado:

 Object.keys(obj) .sort() .reduce((acc, key) => { acc[key] = obj[key]; return acc; }, {});
about 4 years ago · Santiago Trujillo
3 answers
Answer question

0

Otro enfoque de clasificación

 const obj = {4:{1:[{order:1,name:'Test 4'}]},0:{15:[{order:7,name:'Test 1'},{order:3,name:'Test 3'},],12:[{order:1,name:'Test 2'}]}}; const result = Object.entries(obj).flatMap(([u1, v1]) => Object.entries(v1).flatMap(([u2, v2]) => v2.map((v3) => ({ key: u1*1_000 + u2 + v3.order/1_000, item: v3 })) ) ) .sort(({ key: a }, { key: b }) => a - b) .map(({ item }) => item); console.log(result);
 .as-console-wrapper { max-height: 100% !important; top: 0 }

about 4 years ago · Santiago Trujillo Report

0

Las propiedades enteras (en el rango de enteros sin signo de 32 bits) no necesitan clasificación, ya que la iteración sobre ellas (por ejemplo, a través Object.values ) ya está ordenada por especificación por esas claves enteras. Entonces, la lógica debe enfocarse solo en clasificar los objetos internos, y estará bien.

 const flatSort = obj => Array.isArray(obj) ? [...obj].sort((a, b) => a.order - b.order).map(a => a.name) : Object.values(obj).flatMap(flatSort); const obj = { 4: { 1: [ { order: 1, name: 'Test 4' } ] }, 0: { 15: [ { order: 7, name: 'Test 1' }, { order: 3, name: 'Test 3' }, ], 12: [ { order: 1, name: 'Test 2' } ] } }; const res = flatSort(obj); console.log(res);

about 4 years ago · Santiago Trujillo Report

0

Puede ordenar cada obj por claves usando Object.keys(obj).sort() y luego acceder a cada elemento por su clave.

Haz esto 2 veces para obtener la matriz de objetos.

 const obj = { 4: { 1: [ { order: 1, name: 'Test 4' } ] }, 0: { 15: [ { order: 7, name: 'Test 1' }, { order: 3, name: 'Test 3' }, ], 12: [ { order: 1, name: 'Test 2' } ] } } let flatItems = [] const keys = Object.keys(obj).sort() for (const key of keys){ const subObj = obj[key] const subKeys = Object.keys(subObj).sort() for(const subKey of subKeys){ flatItems = flatItems.concat(subObj[subKey].sort((a, b) => a.order - b.order)) } } console.log(flatItems)

about 4 years ago · Santiago Trujillo 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!