tengo un objeto como este
//input let data={ "51": {"name": "text51"}, "54": {"name": "text54"}, "61": {"name": "text61"}, "64": {"name": "text64"}, "71": {"name": "text71"}, "74": {"name": "text74"}, "81": {"name": "text81"}, "84": {"name": "text84"} } /* targeted output { "51": {"name": "text51"}, "61": {"name": "text61"}, "71": {"name": "text71"}, "81": {"name": "text81"}, "54": {"name": "text54"}, "64": {"name": "text64"}, "74": {"name": "text74"}, "84": {"name": "text84"} } */Lo clasifico según el dígito de las claves.
new_key=Object.keys(data).sort((a, b)=>parseInt(a.slice(-1)) - parseInt(b.slice(-1))); //output is ---> ['51', '61', '71', '81', '54', '64', '74', '84']Ahora quiero reorganizar la base del objeto en la salida anterior. (Yo lo hice)
result=new_key.reduce((r, k) => { console.log(r); r[k] = data[k]; return r; }, {}); Cuando console.log(r) para cada iteración, obtuve esto:
Mi pregunta es por qué cuando llegó la tecla 54 fue al medio del objeto en lugar de ir al final.
El orden de las claves de objeto no estaba garantizado anteriormente en JS. Ahora es. Pero así es como va a ser .
Lo que importa aquí es que para números enteros como claves, el orden será ascendente .
Para las claves de cadena, es el orden de inserción , que se puede probar agregando un carácter al número entero cada vez.
let data={ "51": {"name": "text51"}, "54": {"name": "text54"}, "61": {"name": "text61"}, "64": {"name": "text64"}, "71": {"name": "text71"}, "74": {"name": "text74"}, "81": {"name": "text81"}, "84": {"name": "text84"} }; let new_key=Object.keys(data).sort((a, b)=>parseInt(a.slice(-1)) - parseInt(b.slice(-1))); let result=new_key.reduce((r, k) => { console.log(r); r['x-' + k] = data[k]; return r; }, {});No puede definir su propia clasificación de claves de objeto, ya que el navegador (y las especificaciones de ES) tienden a realizar su propia clasificación.
Puede encontrar un montón de preguntas y respuestas en StackOverflow (un par de ejemplos: ES5 , ES6 )
Si realmente le importa el orden, le sugiero que use una matriz en su lugar.
console.log( Object.entries({ "51": {"name": "text51"}, "54": {"name": "text54"}, "61": {"name": "text61"}, "64": {"name": "text64"}, "71": {"name": "text71"}, "74": {"name": "text74"}, "81": {"name": "text81"}, "84": {"name": "text84"}, }).sort(([aKey], [bKey]) => { const aInt = parseInt(aKey.split('').reverse().join(''), 10); const bInt = parseInt(bKey.split('').reverse().join(''), 10); return aInt - bInt; }).reduce((result, [key, value]) => // - key insertion prescedence/order is guaranteed since ES6/ES2015. // // - but is does not apply for pure digit based keys. // - insertion of the latter is handled by an ascending key order. // // ... try ... Object.assign(result, { [key]: value }), {} // ... versus ... // Object.assign(result, { [`_${ key }`]: value }), {} ) ); console.log( Object.entries({ "51": {"name": "text51"}, "54": {"name": "text54"}, "61": {"name": "text61"}, "64": {"name": "text64"}, "71": {"name": "text71"}, "74": {"name": "text74"}, "81": {"name": "text81"}, "84": {"name": "text84"}, }).sort(([aKey], [bKey]) => { const aInt = parseInt(aKey.split('').reverse().join(''), 10); const bInt = parseInt(bKey.split('').reverse().join(''), 10); return aInt - bInt; }).reduce((result, [key, value]) => // - key insertion prescedence/order is guaranteed since ES6/ES2015. // // - but is does not apply for pure digit based keys. // - insertion of the latter is handled by an ascending key order. // // ... try ... // Object.assign(result, { [key]: value }), {} // ... versus ... Object.assign(result, { [`_${ key }`]: value }), {} ) ); .as-console-wrapper { min-height: 100%!important; top: 0; }