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; }, {});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 }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);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)