Si tengo un objeto JavaScript como:
var list = {
"you": 100,
"me": 75,
"foo": 116,
"bar": 15
};
¿Hay alguna forma de ordenar las propiedades en función del valor? Para que termine con
list = {
"bar": 15,
"me": 75,
"you": 100,
"foo": 116
};
javascript
sorting
properties
object
Steerpike
fuente
fuente
Object.entries
respuesta basada en apenas votos que es el estado de la técnica más limpio y legible desde ES2017: stackoverflow.com/a/37607084/245966Respuestas:
Muévalos a una matriz, ordene esa matriz y luego use esa matriz para sus propósitos. Aquí hay una solución:
Una vez que tenga la matriz, puede reconstruir el objeto de la matriz en el orden que desee, logrando así exactamente lo que se propuso hacer. Eso funcionaría en todos los navegadores que conozco, pero dependería de una peculiaridad de implementación y podría romperse en cualquier momento. Nunca debe hacer suposiciones sobre el orden de los elementos en un objeto JavaScript.
fuente
keys()
solo es compatible con IE9 + (y otros navegadores modernos), si eso es preocupante. Tambiénkeys()
excluye las propiedades enumerables de la cadena de prototipos de elementos (a diferencia de for..in), pero eso suele ser más deseable._.pairs
convierte un objeto en [[clave1, valor1], [clave2, valor2]]. Entonces llame a ordenar por eso. Luego invoque_.object
para devolverlo.No queremos duplicar toda la estructura de datos, o usar una matriz donde necesitamos una matriz asociativa.
Aquí hay otra forma de hacer lo mismo que bonna:
fuente
keysSorted
es una matriz! No es un objeto!.map(key => list[key]);
al final de la clasificación, devolverá todo el objeto en lugar de solo la claveSus objetos pueden tener cualquier cantidad de propiedades y puede elegir ordenar por cualquier propiedad de objeto que desee, número o cadena, si coloca los objetos en una matriz. Considere esta matriz:
ordenar por fecha de nacimiento, mayor primero
ordenar por nombre
http://jsfiddle.net/xsM5s/16/
fuente
substr
salir del primer carácter; másDiana
yDebra
tener un orden indefinido. Además, subyDate
tipo realmente usanum
, noborn
.x.localeCompare(y)
localCompare
parece una función muy útil! Solo tenga en cuenta que no será compatible con todos los navegadores: IE 10 y menos, Safari Mobile 9 y menos.Para completar, esta función devuelve una matriz ordenada de propiedades de objeto:
Jsfiddle con el código anterior está aquí . Esta solución se basa en este artículo. .
El violín actualizado para ordenar cadenas está aquí. Puede eliminar ambas conversiones .toLowerCase () adicionales para la comparación de cadenas entre mayúsculas y minúsculas.
fuente
Presenta ECMAScript 2017
Object.values / Object.entries
. Como su nombre lo indica, el primero agrega todos los valores de un objeto en una matriz, y el segundo hace todo el objeto en una matriz de[key, value]
matrices; El equivalente de Pythondict.values()
ydict.items()
.Las características hacen que sea bastante más fácil clasificar cualquier hash en un objeto ordenado. A partir de ahora, solo una pequeña parte de las plataformas JavaScript los admite , pero puede probarlo en Firefox 47+.
fuente
Sorting JavaScript Object by property value
? Creo que entendió mal la pregunta, ya que debe cambiar el Objeto original y no crear una nueva Matriz a partir de él.Un "flechas" versión de @marcusR 's respuesta de remisión
ACTUALIZACIÓN: abril de 2017 : devuelve un
myObj
objeto ordenado definido anteriormente.Pruébalo aquí!
ACTUALIZACIÓN: octubre de 2018 - versión Object.entries
Pruébalo aquí!
fuente
var myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
entries
. Según el estándar, un objeto es una colección desordenada de propiedades . Bueno, eso significa que si está tratando de construir el nuevo objeto después de ordenarlo por el valor de la propiedad o cualquier otra cosa, el orden de las claves de propiedad vuelve a estar indefinido. Chrome, por ejemplo, ordena de forma predeterminada las claves de propiedad, por lo que cada intento de ordenarlas de manera diferente es inútil. Su única posibilidad es obtener un "índice" basado en sus preferencias de pedido y recorrer el objeto original en consecuencia.sort()
enObject.entries()
Los objetos JavaScript están desordenados por definición (consulte la Especificación del lenguaje ECMAScript , sección 8.6). La especificación del lenguaje ni siquiera garantiza que, si itera sobre las propiedades de un objeto dos veces seguidas, saldrán en el mismo orden la segunda vez.
Si necesita ordenar cosas, use una matriz y el método Array.prototype.sort.
fuente
OK , como ya sabrán, javascript tiene la función sort () , para ordenar las matrices, pero nada para el objeto ...
Entonces, en ese caso, necesitamos obtener de alguna manera la matriz de las claves y ordenarlas, esa es la razón por la que la API te da objetos en una matriz la mayor parte del tiempo, porque Array tiene más funciones nativas para jugar con ellas que el objeto literal, de todos modos, la solución rápida está usando Object.key que devuelve una matriz de las teclas de objeto, creo la función ES6 a continuación que hace el trabajo por usted, utiliza las funciones nativas sort () y reduce () en javascript:
Y ahora puedes usarlo así:
Verifique sortedMyObject y podrá ver el resultado ordenado por claves como esta:
También de esta manera, el objeto principal no se tocará y en realidad obtendremos un nuevo objeto.
También creo la imagen a continuación, para que los pasos de la función sean más claros, en caso de que necesite cambiarlo un poco para que funcione a su manera:
fuente
c: 3
ac: 13
y lo verás desmoronarse.fuente
Actualización con ES6: si su preocupación es tener un objeto ordenado para recorrer en iteración (es por eso que me imagino que desea ordenar sus propiedades de objeto), puede usar el objeto Mapa .
Puede insertar sus pares (clave, valor) en orden ordenado y luego hacer un
for..of
ciclo garantizará que se repitan en el orden en que los insertófuente
for-in
oObject.keys
, sino que se define a ser respetado porObject.getOwnPropertyNames
y los otros nuevos métodos para acceder a las matrices nombre de la propiedad. Entonces esa es otra opción.Map
realidad, tiene una estructura de datos que puede almacenar en orden ordenado (ordenar sus datos, recorrerlos y almacenarlos en el mapa) donde no está garantizado que con objetos.Underscore.js o Lodash.js para arreglos avanzados u tipos de objetos
manifestación
fuente
Muy corto y simple!
fuente
Estoy siguiendo la solución dada por slebetman (ve a leerla para todos los detalles), pero ajustada, ya que tu objeto no está anidado.
fuente
Ordenar valores sin múltiples for-loops (para ordenar por las claves, cambie el índice en la devolución de llamada de clasificación a "0")
fuente
Esta podría ser una manera simple de manejarlo como un objeto ordenado real. No estoy seguro de lo lento que es. También podría ser mejor con un bucle while.
Y luego encontré esta función invertida en: http://nelsonwells.net/2011/10/swap-object-key-and-values-in-javascript/
Entonces
fuente
salida = [{p: 8}, {c: 2}, {b: 1}, {g: 1}]
fuente
Por si acaso, alguien está buscando mantener el objeto (con claves y valores), utilizando el código de referencia de @Markus R y el comentario de @James Moran, solo use:
fuente
map
,forEach
sería mejorSalida:
fuente
muchas funciones similares y útiles: https://github.com/shimondoodkin/groupbyfunctions/
fuente
Objeto ordenado por valor (DESC)
fuente
Aquí hay un ejemplo más:
fuente
fuente
Mecanografiado
La siguiente función ordena el objeto por valor o una propiedad del valor. Si no usa TypeScript, puede eliminar la información de tipo para convertirla a JavaScript.
Uso
El orden de las claves en un objeto JavaScript no está garantizado, por lo que estoy ordenando y devolviendo el resultado como un
Map
objeto que conserva el orden de clasificación.Si desea convertirlo nuevamente a Objeto, puede hacer esto:
fuente
la entrada es objeto, la salida es objeto, usando lodash & js lib incorporado, con opción descendente o ascendente, y no muta el objeto de entrada
por ejemplo, entrada y salida
La implementación
fuente
fuente
mi solución con sort:
fuente
fuente
Otra forma de resolver esto: -
// res tendrá la matriz de resultados
fuente
Gracias y sigue respondiendo @Nosredna
Ahora que entendemos que el objeto debe convertirse en una matriz, luego ordene la matriz. Esto es útil para ordenar la matriz (o el objeto convertido en matriz) por cadena:
fuente
Prueba esto. Incluso su objeto no tiene la propiedad en función de la cual está tratando de ordenar también se manejará.
Simplemente llámelo enviando propiedad con objeto.
fuente