Tengo la siguiente estructura de objeto
{ "Apr-18" : { ... }, "Jan-18" : { ... }, "Feb-18" : { ... }, ... }Estoy tratando de ordenar las teclas de mes (MMM-AA) para que se muestre de la siguiente manera
{ "Jan-18" : { ... }, "Feb-18" : { ... }, "Apr-18" : { ... }, ... }Mi código para esto está abajo. Estoy usando moment.js para convertir la fecha en su época para la comparación de clasificación. Seguí aproximadamente la solución que se muestra aquí Ordenar objeto JavaScript por clave Sin embargo, no funciona.
El archivo console.log devuelve el objeto tal como estaba, no se ha producido ninguna clasificación. ¿Qué me estoy perdiendo?
const object = { "Apr-18" : { "a":"b" }, "Jan-18" : { "c":"d" }, "Feb-18" : { "e":"f" } } const sortObjectMonths = (obj) => Object.fromEntries(Object.entries(obj).sort( (a, b) => Date.parse(moment(a, "MMM-YY") - Date.parse(moment(b, "MMM-YY"))) )); let sorted = sortObjectMonths(object) console.log(sorted)Su código está casi bien, pero en .sort(), los elementos a y b son matrices de clave y valor. La clave está en el índice 0 y el valor en el índice 1. Date.parse() no funcionará y se sugiere convertir el valor usando new Date(). Entonces, su código debería ser:
const moment = require("moment"); const sort = { clientname: { "Feb-18": { test: "c" }, "Jan-18": { test: "a" }, "Apr-18": { test: "v" }, }, }; const sortObjectMonths = (obj) => { return Object.fromEntries( Object.entries(obj).sort( (a, b) => moment(new Date(a[0])) - moment(new Date(b[0])) ) ); }; let sorted = sortObjectMonths(sort.clientname); console.log(sorted);Puede usar Object.entries() para obtener las claves y los valores de propiedad del objeto, luego use Array.sort() para ordenarlos usando el momento. Simplemente podemos restar los valores de momento para ordenarlos.
El Array.sort() acepta dos argumentos, firstEl, secondEl, en este caso serán [key1, value1], [key2, value2]. Podemos usar la desestructuración para escribirlos como ([a,],[b,]), donde ayb son las claves del objeto (por ejemplo, 'Abr-18').
Luego usaremos Object.fromEntries() para obtener nuestro objeto ordenado.
const object = { "Apr-18" : { "a":"b" }, "Jan-18" : { "c":"d" }, "Feb-18" : { "e":"f" }, } console.log('Original object:', object) const sortedObject = Object.fromEntries( Object.entries(object).sort(([a,],[b,]) => { return moment(a, "MMM-YY") - moment(b, "MMM-YY"); }) ) console.log('Sorted object:', sortedObject) <script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js" referrerpolicy="no-referrer"></script>sin momento
const months = ["Jan","Feb","Mar","Apr"] const object = { "Apr-18" : { "a":"b" }, "Jan-18" : { "c":"d" }, "Feb-18" : { "e":"f" }, } const sortedObject = Object.fromEntries( Object.entries(object) .sort(([a,],[b,]) => months.indexOf(a.split("-")[0]) - months.indexOf(b.split("-")[0])) ) console.log('Sorted object:', sortedObject)