Si j'ai un objet JavaScript tel que:
var list = {
"you": 100,
"me": 75,
"foo": 116,
"bar": 15
};
Existe-t-il un moyen de trier les propriétés en fonction de la valeur? Pour que je me retrouve avec
list = {
"bar": 15,
"me": 75,
"you": 100,
"foo": 116
};
javascript
sorting
properties
object
Steerpike
la source
la source
Object.entries
réponse à peine surévaluée qui est l'état de l'art le plus propre et le plus lisible depuis ES2017: stackoverflow.com/a/37607084/245966Réponses:
Déplacez-les vers un tableau, triez ce tableau, puis utilisez ce tableau à vos fins. Voici une solution:
Une fois que vous avez le tableau, vous pouvez reconstruire l'objet à partir du tableau dans l'ordre que vous souhaitez, réalisant ainsi exactement ce que vous vous apprêtez à faire. Cela fonctionnerait dans tous les navigateurs que je connais, mais cela dépendrait d'une bizarrerie d'implémentation et pourrait casser à tout moment. Vous ne devez jamais faire d'hypothèses sur l'ordre des éléments dans un objet JavaScript.
la source
keys()
est uniquement pris en charge par IE9 + (et d'autres navigateurs modernes), si cela vous inquiète.keys()
Exclut également les propriétés énumérables de la chaîne de prototypes d'éléments (contrairement à for..in) - mais cela est généralement plus souhaitable._.pairs
transforme un objet en [[clé1, valeur1], [clé2, valeur2]]. Ensuite, appelez sort sur cela. Appelez-_.object
le ensuite pour le retourner.Nous ne voulons pas dupliquer la structure de données entière, ou utiliser un tableau où nous avons besoin d'un tableau associatif.
Voici une autre façon de faire la même chose que bonna:
la source
keysSorted
est un tableau! Pas un objet!.map(key => list[key]);
à la fin du tri, il renverra tout l'objet au lieu de simplement la cléVos objets peuvent avoir n'importe quelle quantité de propriétés et vous pouvez choisir de trier par n'importe quelle propriété d'objet que vous voulez, nombre ou chaîne, si vous placez les objets dans un tableau. Considérez ce tableau:
trier par date de naissance, le plus ancien en premier
Trier par nom
http://jsfiddle.net/xsM5s/16/
la source
substr
sortir du premier caractère; d'autreDiana
etDebra
ont un ordre indéfini. De plus, votrebyDate
tri utilise réellementnum
, nonborn
.x.localeCompare(y)
localCompare
ressemble à une fonction très utile! Notez simplement qu'il ne sera pas pris en charge dans tous les navigateurs - IE 10 et moins, Safari Mobile 9 et moins.Par souci d'exhaustivité, cette fonction renvoie un tableau trié des propriétés des objets:
Jsfiddle avec le code ci-dessus est ici . Cette solution est basée sur cet article .
Le violon mis à jour pour le tri des chaînes est ici. Vous pouvez supprimer les deux conversions .toLowerCase () supplémentaires pour une comparaison de chaîne sensible à la casse.
la source
Présentation d'ECMAScript 2017
Object.values / Object.entries
. Comme son nom l'indique, le premier regroupe toutes les valeurs d'un objet dans un tableau, et le second fait l'objet entier dans un tableau de[key, value]
tableaux; L'équivalent de Pythondict.values()
etdict.items()
.Les fonctionnalités permettent de trier plus facilement n'importe quel hachage en un objet ordonné. Pour l'instant, seule une petite partie des plateformes JavaScript les prend en charge , mais vous pouvez l'essayer sur Firefox 47+.
la source
Sorting JavaScript Object by property value
? vous avez mal compris la question, je pense, puisque vous devez changer l'Objet d'origine et ne pas en créer un nouveau Tableau.Une version « fléchée » de l » @marcusR réponse pour référence
MISE À JOUR: avril 2017 - Cela renvoie un
myObj
objet trié défini ci-dessus.Essayez-le ici!
MISE À JOUR: octobre 2018 - version Object.entries
Essayez-le ici!
la source
var myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
entries
. Selon la norme, un objet est une collection de propriétés non ordonnée . Eh bien, cela signifie que si vous essayez de construire le nouvel objet après l'avoir trié par valeur de propriété ou toute autre chose, l'ordre des clés de propriété devient à nouveau indéfini. Chrome, par exemple, commande par défaut les clés de propriété, donc chaque tentative de les classer différemment est inutile. Votre seule chance est d'obtenir un "index" basé sur vos préférences de commande et de parcourir l'objet d'origine en conséquence.sort()
surObject.entries()
Les objets JavaScript ne sont pas classés par définition (voir la spécification du langage ECMAScript , section 8.6). La spécification du langage ne garantit même pas que, si vous parcourez les propriétés d'un objet deux fois de suite, elles sortiront dans le même ordre la deuxième fois.
Si vous avez besoin de commandes, utilisez un tableau et la méthode Array.prototype.sort.
la source
OK , comme vous le savez peut-être, javascript a la fonction sort () , pour trier les tableaux, mais rien pour l'objet ...
Donc, dans ce cas, nous devons en quelque sorte obtenir un tableau des clés et les trier, c'est la raison pour laquelle les API vous donnent des objets dans un tableau la plupart du temps, car Array a plus de fonctions natives pour jouer avec elles que les objets littéraux, de toute façon, la solution rapide utilise Object.key qui retourne un tableau des clés d'objet, je crée la fonction ES6 ci-dessous qui fait le travail pour vous, elle utilise les fonctions natives sort () et Reduce () en javascript:
Et maintenant, vous pouvez l'utiliser comme ceci:
Vérifiez le sortedMyObject et vous pouvez voir le résultat trié par des clés comme ceci:
De cette façon, l'objet principal ne sera pas touché et nous obtenons en fait un nouvel objet.
Je crée également l'image ci-dessous, pour rendre les étapes de la fonction plus claires, au cas où vous auriez besoin de la modifier un peu pour qu'elle fonctionne à votre façon:
la source
c: 3
pourc: 13
et vous le verrez s'effondrer.la source
Mise à jour avec ES6: si votre souci est d'avoir un objet trié à parcourir (c'est pourquoi j'imagine que vous voulez que vos propriétés d'objet soient triées), vous pouvez utiliser l' objet Map .
Vous pouvez insérer vos paires (clé, valeur) dans l'ordre trié, puis faire une
for..of
boucle garantira leur boucle dans l'ordre dans lequel vous les avez inséréesla source
for-in
Object.keys
Object.getOwnPropertyNames
Map
vous , vous avez en fait une structure de données qui peut stocker dans l'ordre trié (trier vos données, les parcourir et les stocker dans la carte) où, comme vous n'êtes pas assuré qu'avec objets.Underscore.js ou Lodash.js pour les tris avancés de tableaux ou d'objets
démo
la source
Très court et simple!
la source
Je suis la solution proposée par slebetman (allez le lire pour tous les détails), mais ajustée, puisque votre objet n'est pas imbriqué.
la source
Trier les valeurs sans plusieurs boucles for (pour trier par les clés, changer l'index dans le rappel de tri à "0")
la source
Cela pourrait être un moyen simple de le gérer comme un véritable objet ordonné. Je ne sais pas à quel point c'est lent. pourrait aussi être mieux avec une boucle while.
Et puis j'ai trouvé cette fonction inversée à partir de: http://nelsonwells.net/2011/10/swap-object-key-and-values-in-javascript/
Donc
la source
sortie = [{p: 8}, {c: 2}, {b: 1}, {g: 1}]
la source
Juste au cas où quelqu'un cherche à garder l'objet (avec des clés et des valeurs), en utilisant la référence de code par @Markus R et @James Moran commentaire, utilisez simplement:
la source
map
, ceforEach
serait mieuxProduction:
la source
de nombreuses fonctions similaires et utiles: https://github.com/shimondoodkin/groupbyfunctions/
la source
Objet trié par valeur (DESC)
la source
Voici encore un exemple:
la source
la source
Manuscrit
La fonction suivante trie l'objet par valeur ou une propriété de la valeur. Si vous n'utilisez pas TypeScript, vous pouvez supprimer les informations de type pour les convertir en JavaScript.
Usage
L'ordre des clés dans un objet JavaScript n'est pas garanti, donc je trie et renvoie le résultat en tant
Map
qu'objet qui préserve l'ordre de tri.Si vous souhaitez le reconvertir en objet, vous pouvez le faire:
la source
l'entrée est un objet, la sortie est un objet, en utilisant la bibliothèque intégrée lodash & js, avec une option décroissante ou ascendante, et ne mute pas l'objet d'entrée
par exemple entrée et sortie
La mise en oeuvre
la source
la source
ma solution avec tri:
la source
la source
Une autre façon de résoudre ce problème: -
// res aura le tableau de résultats
la source
Merci et continuez de répondre @Nosredna
Maintenant que nous comprenons que l'objet doit être converti en tableau, puis triez le tableau. ceci est utile pour trier un tableau (ou un objet converti en tableau) par chaîne:
la source
Essaye ça. Même votre objet n'ayant pas la propriété sur laquelle vous essayez de trier sera également géré.
Appelez-le simplement en envoyant une propriété avec un objet.
la source