Tri Objet JavaScript par la valeur de la propriété
Si j'ai un objet JavaScript tels que:
var list = {
"you": 100,
"me": 75,
"foo": 116,
"bar": 15
};
Est-il un moyen de trier les propriétés sur la base de la valeur? De sorte que je me retrouve avec
list = {
"bar": 15,
"me": 75,
"you": 100,
"foo": 116
};
- Non seulement "tri", mais plus important encore, le tri des nombres. Les numéros sont à l'abri des Javascripts Tableau.méthode sort (), ce qui signifie que vous ne serez pas juste de trouver une méthode pour le tri des propriétés, mais vous aurez à écrire votre propre fonction pour comparer les valeurs numériques.
- Autant que je sache, les objets n'ont pas d'ordre comme des tableaux faire.
- Avant de lire les réponses: La réponse est N. L'ordre des propriétés de l'objet est non-standard dans ECMAScript. Vous ne devriez jamais faire des hypothèses sur l'ordre des éléments dans un objet JavaScript. Un Objet est une collection non ordonnée de propriétés. Les réponses ci-dessous vous montrent comment "utiliser" triés propriétés, en utilisant l'aide de tableaux, mais jamais en fait de modifier l'ordre des propriétés des objets eux-mêmes. Donc, non, il n'est pas possible. Même si vous construisez un objet avec le tri préalable des propriétés, il n'est pas garanti qu'ils seront affichés dans le même ordre dans l'avenir. Lisez la suite :).
- pourtant, dans le monde réel frontend applications que l'on boucle sur les collections d'objets avec des Id que les touches et l'ordre est important si la traduction de modèles HTML. Tu dis qu'ils ont pas d'ordre, je dis qu'ils ont exactement l'ordre que je vois lors de la console.la journalisation dans le navigateur actuel. Et cet ordre peut être réorganisées. Dès que vous vous en boucle sur eux, ils ont un ordre.
- Il est maintenant un moyen d'accéder à des propriétés dans un ordre spécifié dans la spécification. Est-ce une bonne idée? Presque certainement pas. 🙂 Mais il est là, comme de ES2015.
- ah, vous avez absolument raison. Encore, avec tous les risques qui viennent avec cet ajout, j'espère que nos collègues SI ils vont lire la frontière avant l'adoption de cette nouvelle approche (comme toujours). 😀
- 2019 visiteurs: cochez cette peine upvoted
Object.entries
de réponse qui est la plus propre et la plus lisible de l'état de l'art depuis ES2017: stackoverflow.com/a/37607084/245966
Vous devez vous connecter pour publier un commentaire.
Les déplacer dans un tableau, trier ce tableau, et ensuite utiliser ce tableau pour vos besoins. Voici une solution:
Une fois que vous avez le tableau, vous pouvez reconstruire l'objet du tableau dans l'ordre que vous voulez, pour ainsi obtenir exactement ce que vous vous apprêtez à faire. Qui fonctionne dans tous les navigateurs, je sais, mais il serait subordonnée à une mise en œuvre caprice, et pourrait se briser à tout moment. Vous ne devriez jamais faire des hypothèses sur l'ordre des éléments dans un objet JavaScript.
keys()
est uniquement pris en charge par IE9+ (et les autres navigateurs modernes), si c'est un sujet de préoccupation. Aussikeys()
exclut les propriétés énumérables à partir d'éléments de la chaîne de prototype (à la différence de for..in) - mais qui est généralement plus souhaitable._.pairs
transforme un objet en [ [key1, valeur1], [cle2, valeur2] ]. Appelez ensuite les trier sur que. Appelez ensuite_.object
sur elle pour le rallumer.string keys
, alors vous pouvez utiliser:return a[1] > b[1];
.var sortedAsObject = {}; sortable.forEach(function(item){sortedAsObject[item[0]]=item[1]})
Nous ne voulons pas de dupliquer l'ensemble de la structure de données, 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:
JS:
keysSorted
est un tableau! Pas un objet!.map(key => list[key]);
à la fin de la sorte, il sera de retour l'ensemble de 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 quel que soit l'objet de la propriété que vous souhaitez, le nombre ou une chaîne, si vous placez les objets dans un tableau. Considérer ce tableau:
trier par date de naissance, les plus anciens en premier
trier par nom
http://jsfiddle.net/xsM5s/16/
substr
le premier caractère; d'autreDiana
etDebra
ont un ordre non défini. Aussi, votrebyDate
de tri utilisenum
, pasborn
.x.localeCompare(y)
Par souci d'exhaustivité, cette fonction renvoie tableau trié de propriétés de l'objet:
Jsfiddle avec le code ci-dessus est ici. Cette solution est basée sur cet article.
Mis à jour le violon pour le tri des chaînes est ici. Vous pouvez supprimer les deux autres .toLowerCase() conversions pour la casse de la chaîne de comparaison.
Des objets JavaScript sont non ordonnée par définition (voir le Langage ECMAScript
Spécification, section 8.6). Le langage de spécification n'est même pas la garantie que, si vous itérer sur les propriétés d'un objet deux fois de suite, ils vont venir dans le même ordre pour la deuxième fois.
Si vous avez besoin de choses à être commandés, l'utilisation d'une matrice et la Matrice.le prototype.méthode de tri.
Un "flèches" de la version de @marcusR 's réponse de référence
Mise à JOUR: avril 2017
- Cela renvoie une triés
myObj
objet défini ci-dessus.Essayer ici!
Mise à JOUR: octobre 2018 - Objet.les entrées de la version
Essayer ici!
var myObj = {"1": {"Value": 40}, "2": {"Value": 10}, "3": {"Value": 30}, "4": {"Value": 20}};
entries
. Selon la norme, un objet est une collection non ordonnée de propriétés. Eh bien, cela signifie que si vous essayez de construire le nouvel objet après le tri par la valeur de la propriété ou quoi que ce soit d'autre, la propriété de commande de clés est à nouveau défini. Chrome, par exemple, est par défaut de la commande de la propriété touches, donc toute tentative de classer différemment est inutile. Votre seule chance est d'obtenir un "index", basé sur votre commande de préférences et de parcourir à l'objet d'origine en conséquence.sort()
surObject.entries()
Object.assign()
serait tellement plus performant que de diffuser_sortedObj
dans l'réduireECMAScript 2017 introduit
de l'Objet.valeurs /Objet.entrées
. Comme le nom le suggère, l'ancien agrégats de toutes les valeurs d'un objet dans un tableau, et celui-ci ne l'ensemble de l'objet dans un tableau de[key, value]
tableaux; Python est l'équivalent dedict.les valeurs de()
etdict.les éléments()
.Les caractéristiques rendent assez facile de trier tout hachage dans un objet de livraison. A partir de maintenant, seule une petite partie de JavaScript plates-formes de les soutenir, mais vous pouvez l'essayer sur Firefox 47+.
Sorting JavaScript Object by property value
? vous avez mal compris la question, je pense, puisque vous êtes de changer l'Objet d'origine et de ne pas créer un nouveau Tableau à partir d'elle.OK, comme vous le savez peut-être, javascript a sort() fonction, pour trier des tableaux, mais rien pour objet...
Donc, dans ce cas, nous avons besoin d'obtenir en quelque sorte de matrice de touches et de les trier, c'est la raison de l'api vous donne objets dans un tableau, la plupart du temps, parce que la Matrice a plus de fonctions natives de jouer avec eux que littéral d'objet, de toute façon, le rapide solotion est à l'aide de Objet.clé qui retourne un tableau de clés de l'objet, j'ai créer le ES6 fonction ci-dessous qui vous fait le travail, il utilise natif sort() et réduire() des fonctions en javascript:
Et maintenant vous pouvez l'utiliser comme ceci:
Vérifier la sortedMyObject et vous pouvez voir le résultat trié par des touches de cette manière:
Aussi de cette façon, l'objet principal de ne pas être touché, et nous réellement obtenir un nouvel objet.
J'ai aussi créer l'image ci-dessous, afin de rendre la fonction plus clair, dans le cas où vous avez besoin de changer un peu de travail à votre façon:
c: 3
àc: 13
et vous allez le voir tomber en dehors.Mise à jour avec ES6: Si votre souci est d'avoir une triés objet à parcourir (c'est pourquoi j'imagine que vous voulez que votre objet propriétés triées), vous pouvez utiliser le Carte objet.
Vous pouvez insérer votre (clé, valeur) paires dans l'ordre de tri et ensuite de faire un
for..of
boucle garantie de les avoir en boucle dans l'ordre que vous avez inséré euxfor-in
ouObject.keys
, mais il est défini à être respecté parObject.getOwnPropertyNames
et l'autre de nouvelles méthodes d'accès à la propriété nom des tableaux. C'est donc une autre option.Map
vous avez réellement besoin d'une structure de données qui permet de stocker dans l'ordre de tri (tri de vos données, de boucle et de le stocker dans la carte) où, comme vous n'êtes pas garanti qu'avec les objets.Underscore.js ou Lodash.js pour les avancés tableau ou un objet sortes
démo
Je suis la solution donnée par slebetman (allez le lire pour tous les détails), mais ajustée, depuis votre objet est non-imbriquées.
Cela pourrait être un moyen simple de le manipuler comme un véritable objet de livraison. Pas sûr de savoir comment ralentir il est. aussi pourriez être mieux avec une boucle while.
Et puis j'ai trouvé cette inverser la fonction de:
http://nelsonwells.net/2011/10/swap-object-key-and-values-in-javascript/
Donc
Juste au cas où, quelqu'un est à la recherche pour le maintien de l'objet (avec des clés et des valeurs), en utilisant le code de référence par @Markus R et @James Moran commentaire, il suffit d'utiliser:
map
,forEach
serait mieuxTrier des valeurs sans pour plusieurs boucles (pour trier les touches de changement de l'indice dans le genre de rappel à "0")
JS:
beaucoup de semblables et fonctions utiles:
https://github.com/shimondoodkin/groupbyfunctions/
Objets triés par valeur (DESC)
Ici est un exemple de plus:
JS:
de sortie = [ { p: 8 }, { c: 2 }, { b: 1 }, { g: 1 } ]
Très court et simple!
Tapuscrit
La fonction suivante sortes d'objets par valeur ou une propriété de la valeur. Si vous n'utilisez pas la Machine, vous pouvez supprimer les informations de type pour le convertir en JavaScript.
D'utilisation
La commande de clés dans un objet JavaScript ne sont pas garantis, donc je suis de tri et de retourner le résultat sous la forme d'un
Map
objet qui préserve l'ordre de tri.Si vous voulez convertir à un Objet, vous pouvez le faire:
Une autre façon de résoudre ce problème:-
//res auront le tableau résultat
Merci et continuer réponse @Nosredna
Maintenant que nous comprenons de l'objet doivent être convertis au tableau puis trier le tableau. ceci est utile pour le tri de tableau (ou converti en objet array) par chaîne:
De l'essayer. Même votre objet n'est pas d'avoir la propriété sur la base de laquelle vous êtes en essayant de trier sera également l'occasion de manipulés.
Viens de l'appeler par l'envoi d'une propriété d'objet.
J'ai fait un plugin pour cela, il accepte 1 arg qui est un objet non triés, et retourne un objet qui a été trié par prop valeur. Cela fonctionne sur tous les 2 dimensions des objets tels que des
{"Nick": 28, "Bob": 52}
...Voici une démo de la fonction de travail comme prévu
http://codepen.io/nicholasabrams/pen/RWRqve?editors=001
À l'aide de requête-js vous pouvez le faire comme ceci
Vous pouvez trouver un article d'introduction de la requête-js ici
Couln trouve pas de réponse ci-dessus qui permettrait à la fois de travailler et d'être PETIT, et serait soutien imbriquée les objets (et pas des tableaux), donc j'ai écrit la mienne 🙂 Fonctionne à la fois avec des chaînes et des services de renseignements.
Utilisation:
ici est la façon de trier les objets et obtenir triés objet en retour
vous pouvez personnaliser votre fonction de tri selon vos besoins
Github Gist Lien
d'entrée est l'objet, la sortie est l'objet, à l'aide de lodash & js construit-dans le répertoire lib, descendante ou ascendante option, et ne pas muter objet d'entrée
eg entrée & sortie
La mise en œuvre
Si je vais avoir un Objet comme celui-ci ,
souhaitez trier par ordre de jour,
nous devrions avoir le daySorterMap d'abord,
Lancer un Objet distinct sortedDayObj,
Vous pouvez retourner le sortedDayObj