Necesito ordenar los objetos de JavaScript por clave.
De ahí lo siguiente:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
Se convertiría:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
javascript
sorting
vdh_ant
fuente
fuente
Object.entries
yObject.fromEntries
se agregaron a JS, esto se puede lograr con una frase muy breve:Object.fromEntries(Object.entries(obj).sort())
Respuestas:
Las otras respuestas a esta pregunta están desactualizadas, nunca coincidieron con la realidad de implementación, y se han vuelto oficialmente incorrectas ahora que se ha publicado la especificación ES6 / ES2015.
Consulte la sección sobre el orden de iteración de propiedades en Explorando ES6 por Axel Rauschmayer :
Entonces, sí, los objetos JavaScript están de hecho ordenados, y el orden de sus claves / propiedades se puede cambiar.
Así es como puede ordenar un objeto por sus claves / propiedades, alfabéticamente:
Use en
var
lugar deconst
por compatibilidad con motores ES5.fuente
Los objetos JavaScript 1 no están ordenados. No tiene sentido tratar de "ordenarlos". Si desea iterar sobre las propiedades de un objeto, puede ordenar las claves y luego recuperar los valores asociados:
Implementación alternativa usando
Object.keys
fantasía:1 No para ser pedante, pero no existe un objeto JSON .
fuente
{"a", 1}
como JSON Array es un término preciso para una cadena como[1]
. Es útil poder comunicarse diciendo cosas como el tercer objeto en mi matriz cuando tiene la cadena[{x: 1}, {y: 2}, {z: 3}]
, por lo que prefiero "Eso no es un objeto JSON" al comentar sobre un literal Javascript, en lugar de "No existe tal cosa como un objeto JSON ", que solo causará más confusión y dificultades de comunicación más adelante cuando el OP realmente esté trabajando con JSON.{"a", 1}
es un objeto literal o un texto JSON (también conocido como cadena JSON, si realmente lo prefiere). Lo que depende del contexto, el primero si aparece literalmente dentro del código fuente de JavaScript, el segundo si es una cadena que debe pasarse a un analizador JSON para seguir utilizándose. Existen diferencias reales entre los dos cuando se trata de sintaxis permitida, uso correcto y serialización.Mucha gente ha mencionado que "los objetos no se pueden ordenar" , pero después de eso le están dando una solución que funciona. Paradoja, ¿no es así?
Nadie menciona por qué esas soluciones están funcionando. Lo son, porque en la mayoría de las implementaciones del navegador los valores en los objetos se almacenan en el orden en que se agregaron. Es por eso que si crea un nuevo objeto a partir de una lista ordenada de claves, está devolviendo un resultado esperado.
Y creo que podríamos agregar una solución más: la forma funcional ES5:
Versión ES2015 de arriba (formateada para "one-liner"):
Breve explicación de los ejemplos anteriores (como se pide en los comentarios):
Object.keys
nos está dando una lista de claves en el objeto proporcionado (obj
oo
), luego ordenamos las que usan el algoritmo de clasificación predeterminado, luego.reduce
se usa para convertir esa matriz nuevamente en un objeto, pero esta vez con todas las claves ordenadas.fuente
for...in
).Object.keys(dict).sort().reduce((r, k) => Object.assign(r, { [k]: dict[k] }), {});
Chicos, estoy figurativamente sorprendido! ¡Seguro que todas las respuestas son algo viejas, pero nadie mencionó la estabilidad en la clasificación! Así que tengan paciencia conmigo, haré todo lo posible para responder la pregunta en sí y entrar en detalles aquí. Así que voy a disculparme ahora, será mucho para leer.
Como es 2018, solo usaré ES6, los Polyfills están disponibles en los documentos de MDN, que vincularé en la parte dada.
Respuesta a la pregunta:
Si sus claves son solo números, puede usarlas
Object.keys()
con seguridadArray.prototype.reduce()
para devolver el objeto ordenado:Sin embargo, si está trabajando con cadenas, le recomiendo encadenar
Array.prototype.sort()
todo esto:Si alguien se pregunta qué reduce:
Si es necesario, aquí está la explicación del único revestimiento:
Por qué ordenar es un poco complicado:
En resumen
Object.keys()
, devolverá una matriz en el mismo orden que obtenemos con un bucle normal:Nota al margen: también se puede usar
Object.keys()
en matrices, tenga en cuenta que se devolverá el índice:Pero no es tan fácil como se muestra en esos ejemplos, los objetos del mundo real pueden contener números y caracteres alfabéticos o incluso símbolos (por favor, no lo haga).
Aquí hay un ejemplo con todos ellos en un objeto:
Ahora, si usamos
Array.prototype.sort()
en la matriz de arriba, la salida cambia:Aquí hay una cita de los documentos:
Debe asegurarse de que uno de ellos le devuelva el resultado deseado. En los ejemplos de Reallife, la gente tiende a mezclar cosas especialmente si usa diferentes entradas de información como API y bases de datos juntas.
¿Así que cuál es el problema?
Bueno, hay dos artículos que todo programador debe entender:
Algoritmo en el lugar :
Así que, básicamente, nuestra matriz anterior se sobrescribirá. Esto es importante si desea mantener la matriz anterior por otros motivos. Así que ten esto en cuenta.
Algoritmo de clasificación
Esto muestra que la clasificación es correcta pero cambió. Entonces, en el mundo real, incluso si la clasificación es correcta, ¡debemos asegurarnos de obtener lo que esperamos! Esto es muy importante, tenga esto en cuenta también. Para obtener más ejemplos de JavaScript, consulte Array.prototype.sort () - documentos: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
fuente
Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {})
.{5: 'hearts'}
o{5: 'spades'}
si comienza a ordenar la matriz, se volverá potencialmente inestable en juegos como rummy. No hablar de diferentes idiomas.Esto funciona para mi
fuente
Es 2019 y tenemos una forma de resolver esto en 2019 :)
fuente
aquí está el trazador de líneas 1
fuente
(o[k] = v, o)
. ¿Por qué funciona esto? ¿Dónde puedo encontrar documentos al respecto? Obviamente, devuelve el parámetro más a la derecha, pero ¿por qué?o[k]
igualav
y luego regresao
Esta es una vieja pregunta, pero siguiendo el ejemplo de la respuesta de Mathias Bynens, hice una versión corta para ordenar el objeto actual , sin mucha sobrecarga.
después de la ejecución del código, el objeto "desordenado" tendrá las claves ordenadas alfabéticamente.
fuente
Usando lodash esto funcionará:
Solo comida para pensar.
fuente
Suponga que podría ser útil en el depurador de VisualStudio que muestra propiedades de objeto desordenadas.
fuente
Versión de subrayado :
Si no confía en su navegador para mantener el orden de las claves, le sugiero que confíe en una matriz ordenada de matrices emparejadas de valores clave.
fuente
_.object(_.sortBy(_.pairs(unordered), _.first))
fuente
Quizás una forma un poco más elegante:
PS y lo mismo con la sintaxis ES6 +:
fuente
ordenación recursiva, para objetos anidados y matrices
fuente
else
allí, podría ser cierto para ambosArray.isArray(obj[key])
y paratypeof obj[key] === 'object'
function sortObjectKeys(obj){
:if(typeof obj != 'object'){ /* it is a primitive: number/string (in an array) */ return obj; }
. Para robustez, al comienzo completo también agregué:if(obj == null || obj == undefined){ return obj; }
Como ya se mencionó, los objetos no están ordenados.
Sin embargo...
Puede encontrar útil este modismo:
Luego, puede iterar a través de kv y hacer lo que desee.
fuente
Aquí hay una versión limpia basada en lodash que funciona con objetos anidados
Sería aún más limpio si lodash tuviera un
toObject()
método ...fuente
Simplemente use lodash para descomprimir el mapa y ordenar Por el primer valor de pair y zip nuevamente, devolverá la clave ordenada.
Si desea ordenar por valor, cambie el índice de par a 1 en lugar de 0
fuente
Ordena las claves de forma recursiva y conserva las referencias.
Ejemplo:
fuente
delete o[e[0]];
allí? ¿No podemos simplemente asignar?fuente
Esta es una solución ligera para todo lo que necesito para la clasificación JSON.
fuente
Use este código si ha anidado objetos o si ha anidado una matriz de obj.
fuente
Solución:
Explicación:
Muchos tiempos de ejecución de JavaScript almacenan valores dentro de un objeto en el orden en que se agregan.
Para ordenar las propiedades de un objeto por sus claves, puede utilizar la función Object.keys que devolverá una matriz de claves. La matriz de claves se puede ordenar por Array.prototype.sort () método que clasifica los elementos de una matriz en su lugar (no es necesario asignarlos a una nueva variable).
Una vez que las claves están ordenadas, puede comenzar a usarlas una por una para acceder al contenido del objeto antiguo para llenar un nuevo objeto (que ahora está ordenado).
A continuación se muestra un ejemplo del procedimiento (puede probarlo en sus navegadores específicos):
Nota: Object.keys es un método ECMAScript 5.1 pero aquí hay un polyfill para navegadores antiguos:
fuente
Transferí algunas enumeraciones de Java a objetos javascript.
Estos objetos me devolvieron las matrices correctas. Si las claves de objeto son de tipo mixto (string, int, char), hay un problema.
Mostrar fragmento de código
fuente
Fragmento simple y legible, usando lodash.
Debe poner la clave entre comillas solo cuando llame a sortBy. No tiene que estar entre comillas en los datos en sí.
Además, su segundo parámetro para asignar es incorrecto. Debería ser una función, pero usar pluck es más fácil.
fuente
Hay un gran proyecto de @sindresorhus llamado sort-keys que funciona de maravilla.
Puedes consultar su código fuente aquí:
https://github.com/sindresorhus/sort-keys
O puede usarlo con npm:
Aquí también hay ejemplos de código de su archivo Léame
fuente
Respuesta de JavaScript puro para ordenar un objeto. Esta es la única respuesta que sé que manejará números negativos. Esta función es para ordenar objetos numéricos.
Ingrese obj = {1000: {}, -1200: {}, 10000: {}, 200: {}};
La salida será un objeto ordenado por esos números con nuevas claves que comienzan en 0.
fuente
Solo para simplificarlo y aclarar la respuesta de Matt Ball
fuente
No estoy seguro si esto responde la pregunta, pero esto es lo que necesitaba.
Llamado :
fuente
La única línea:
fuente
la mejor manera de hacerlo es
Primero puede convertir su objeto casi como una matriz en una matriz real, y luego usar .reverse ():
El espacio vacío al final si causa porque su primer índice es 1 en lugar de 0. Puede quitar el espacio vacío con .length-- o .pop ().
Alternativamente, si desea pedir prestado .reverse y llamarlo sobre el mismo objeto, debe ser un objeto completamente similar a una matriz. Es decir, necesita una propiedad de longitud:
Tenga en cuenta que devolverá el mismo objeto objeto completamente similar a una matriz, por lo que no será una matriz real. Luego puede usar eliminar para eliminar la propiedad de longitud.
fuente