J'ai besoin de trier les objets JavaScript par clé.
D'où ce qui suit:
{ 'b' : 'asdsad', 'c' : 'masdas', 'a' : 'dsfdsfsdf' }
Deviendrait:
{ 'a' : 'dsfdsfsdf', 'b' : 'asdsad', 'c' : 'masdas' }
javascript
sorting
vdh_ant
la source
la source
Object.entries
etObject.fromEntries
ont été ajoutés à JS, cela peut être réalisé avec une doublure bien courte:Object.fromEntries(Object.entries(obj).sort())
Réponses:
Les autres réponses à cette question sont dépassées, n'ont jamais correspondu à la réalité de la mise en œuvre et sont officiellement devenues incorrectes maintenant que la spécification ES6 / ES2015 a été publiée.
Voir la section sur l' ordre d'itération des propriétés dans Exploration ES6 par Axel Rauschmayer :
Alors oui, les objets JavaScript sont en fait ordonnés et l'ordre de leurs clés / propriétés peut être modifié.
Voici comment trier un objet par ses clés / propriétés, par ordre alphabétique:
Utilisez
var
au lieu deconst
pour la compatibilité avec les moteurs ES5.la source
Les objets JavaScript 1 ne sont pas commandés. Cela n'a aucun sens d'essayer de les "trier". Si vous souhaitez parcourir les propriétés d'un objet, vous pouvez trier les clés, puis récupérer les valeurs associées:
Object.keys
Mise en œuvre alternative utilisant la fantaisie:1 Ne pas être pédant, mais un objet JSON n'existe pas .
la source
{"a", 1}
tout comme JSON Array est un terme précis pour une chaîne comme[1]
. Il est utile de pouvoir communiquer en disant des choses comme le troisième objet de mon tableau lorsque vous avez la chaîne[{x: 1}, {y: 2}, {z: 3}]
, donc je préfère de beaucoup "Ce n'est pas un objet JSON" lorsque vous commentez un littéral Javascript, plutôt que "Il n'y en a pas chose en tant qu'objet JSON ", ce qui va juste causer plus de confusion et de difficultés de communication plus tard lorsque l'OP fonctionne réellement avec JSON.{"a", 1}
est soit un littéral objet, soit un texte JSON (alias chaîne JSON, si vous préférez vraiment). Le choix dépend du contexte, le premier s'il apparaît textuellement dans le code source JavaScript, le second s'il s'agit d'une chaîne qui doit être transmise à un analyseur JSON pour être utilisée plus loin. Il existe de réelles différences entre les deux en ce qui concerne la syntaxe autorisée, l'utilisation correcte et la sérialisation.Beaucoup de gens ont mentionné que "les objets ne peuvent pas être triés" , mais après cela, ils vous donnent une solution qui fonctionne. Paradoxe, n'est-ce pas?
Personne ne mentionne pourquoi ces solutions fonctionnent. Ils le sont, car dans la plupart des implémentations du navigateur, les valeurs des objets sont stockées dans l'ordre dans lequel elles ont été ajoutées. C'est pourquoi si vous créez un nouvel objet à partir d'une liste triée de clés, cela renvoie un résultat attendu.
Et je pense que nous pourrions ajouter une autre solution - la manière fonctionnelle ES5:
Version ES2015 ci-dessus (formatée en "one-liner"):
Brève explication des exemples ci-dessus (comme demandé dans les commentaires):
Object.keys
nous donne une liste de clés dans l'objet fourni (obj
ouo
), puis nous trions celles qui utilisent l'algorithme de tri par défaut, la prochaine.reduce
est utilisée pour reconvertir ce tableau en objet, mais cette fois avec toutes les clés triées.la source
for...in
).Object.keys(dict).sort().reduce((r, k) => Object.assign(r, { [k]: dict[k] }), {});
Les gars, je suis choqué au figuré! Bien sûr, toutes les réponses sont un peu anciennes, mais personne n'a même mentionné la stabilité du tri! Alors soyez indulgents, je ferai de mon mieux pour répondre à la question elle-même et entrer dans les détails ici. Je vais donc m'excuser maintenant, ce sera beaucoup à lire.
Comme c'est 2018, je n'utiliserai que ES6, les Polyfills sont tous disponibles sur la documentation MDN, que je lierai à la partie donnée.
Réponse à la question:
Si vos clés ne sont que des chiffres, vous pouvez les utiliser en toute sécurité
Object.keys()
avecArray.prototype.reduce()
pour renvoyer l'objet trié:Cependant, si vous travaillez avec des chaînes, je recommande fortement d'enchaîner
Array.prototype.sort()
tout cela:Si quelqu'un se demande ce que fait réduire:
Si nécessaire, voici l'explication de la doublure:
Pourquoi le tri est un peu compliqué:
En bref
Object.keys()
retournera un tableau avec le même ordre que celui que nous obtenons avec une boucle normale:Sidenote - vous pouvez également l'utiliser
Object.keys()
sur des tableaux, gardez à l'esprit que l'index sera retourné:Mais ce n'est pas aussi facile que le montrent ces exemples, les objets du monde réel peuvent contenir des chiffres et des caractères alphabétiques ou même des symboles (veuillez ne pas le faire).
Voici un exemple avec tous dans un seul objet:
Maintenant, si nous utilisons
Array.prototype.sort()
sur le tableau ci-dessus, les modifications de sortie:Voici une citation de la documentation:
Vous devez vous assurer que l'un d'eux renvoie la sortie souhaitée pour vous. Dans des exemples réels, les gens ont tendance à mélanger les choses, surtout si vous utilisez ensemble différentes entrées d'informations telles que les API et les bases de données.
Alors, quel est le gros problème?
Eh bien, il y a deux articles que chaque programmeur doit comprendre:
Algorithme sur place :
Donc, fondamentalement, notre ancien tableau sera écrasé! Ceci est important si vous souhaitez conserver l'ancien tableau pour d'autres raisons. Gardez cela à l'esprit.
Algorithme de tri
Cela montre que le tri est correct mais qu'il a changé. Donc dans le monde réel, même si le tri est correct, nous devons nous assurer que nous obtenons ce que nous attendons! C'est très important, gardez cela à l'esprit également. Pour plus d'exemples JavaScript, examinez Array.prototype.sort () - docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort
la source
Object.keys(testObj).sort().reduce((a, c) => (a[c] = testObj[c], a), {})
.{5: 'hearts'}
ou si{5: 'spades'}
vous commencez à trier le tableau, il deviendra potentiellement instable dans des jeux comme le rami. Sans parler de langues différentes.Ça marche pour moi
la source
Nous sommes en 2019 et nous avons un moyen de résoudre ce problème en 2019 :)
la source
voici le 1 liner
la source
(o[k] = v, o)
. Pourquoi cela fonctionne-t-il même, où puis-je trouver des documents à ce sujet? Il renvoie évidemment le paramètre le plus à droite, mais pourquoi?o[k]
égal àv
puis reviento
C'est une vieille question, mais en s'inspirant de la réponse de Mathias Bynens, j'ai fait une version courte pour trier l' objet actuel , sans trop de surcharge.
après l'exécution du code, l'objet "non ordonné" lui-même verra les clés triées alphabétiquement.
la source
En utilisant lodash, cela fonctionnera:
Juste matière à réflexion.
la source
Supposons qu'il puisse être utile dans le débogueur VisualStudio qui affiche les propriétés d'objet non ordonnées.
la source
Version de soulignement :
Si vous ne faites pas confiance à votre navigateur pour conserver l'ordre des clés, je vous suggère fortement de vous fier à un tableau ordonné de tableaux de paires clé-valeur.
la source
_.object(_.sortBy(_.pairs(unordered), _.first))
la source
Peut-être une forme un peu plus élégante:
PS et même avec la syntaxe ES6 +:
la source
tri récursif, pour les objets imbriqués et les tableaux
la source
else
- pourrait être vrai pour les deuxArray.isArray(obj[key])
et pourtypeof obj[key] === 'object'
function sortObjectKeys(obj){
::if(typeof obj != 'object'){ /* it is a primitive: number/string (in an array) */ return obj; }
. Pour plus de robustesse, j'ai également ajouté au démarrage complet:if(obj == null || obj == undefined){ return obj; }
Comme déjà mentionné, les objets ne sont pas classés.
Toutefois...
Vous pouvez trouver cet idiome utile:
Vous pouvez ensuite parcourir le kv et faire ce que vous voulez.
la source
Voici une version propre basée sur lodash qui fonctionne avec des objets imbriqués
Ce serait encore plus propre si lodash avait une
toObject()
méthode ...la source
Utilisez simplement lodash pour décompresser la carte et trier par la première valeur de pair et zip à nouveau, il renverra la clé triée.
Si vous voulez que l'index de paire de valeurs triées soit à 1 au lieu de 0
la source
Trie les clés de manière récursive tout en préservant les références.
Exemple:
la source
delete o[e[0]];
sert? Ne pouvons-nous pas simplement assigner?la source
Il s'agit d'une solution légère à tout ce dont j'ai besoin pour le tri JSON.
la source
Utilisez ce code si vous avez des objets imbriqués ou si vous avez un obj de tableau imbriqué.
la source
Solution:
Explication:
De nombreux runtimes JavaScript stockent les valeurs à l'intérieur d'un objet dans l'ordre dans lequel elles sont ajoutées.
Pour trier les propriétés d'un objet par leurs clés, vous pouvez utiliser la fonction Object.keys qui renverra un tableau de clés. Le tableau de clés peut ensuite être trié par la méthode Array.prototype.sort () qui trie les éléments d'un tableau en place (pas besoin de les affecter à une nouvelle variable).
Une fois les clés triées, vous pouvez commencer à les utiliser une par une pour accéder au contenu de l'ancien objet afin de remplir un nouvel objet (qui est maintenant trié).
Voici un exemple de la procédure (vous pouvez la tester dans vos navigateurs ciblés):
Remarque: Object.keys est une méthode ECMAScript 5.1 mais voici un polyfill pour les navigateurs plus anciens:
la source
J'ai transféré quelques énumérations Java vers des objets javascript.
Ces objets m'ont retourné des tableaux corrects. si les clés d'objet sont de type mixte (string, int, char), il y a un problème.
Afficher l'extrait de code
la source
Extrait simple et lisible, utilisant lodash.
Vous devez mettre la clé entre guillemets uniquement lorsque vous appelez sortBy. Il n'est pas nécessaire qu'il soit entre guillemets dans les données elles-mêmes.
De plus, votre deuxième paramètre à mapper est incorrect. Cela devrait être une fonction, mais l'utilisation de la plumaison est plus facile.
la source
Il y a un grand projet de @sindresorhus appelé sort-keys qui fonctionne très bien.
Vous pouvez vérifier son code source ici:
https://github.com/sindresorhus/sort-keys
Ou vous pouvez l'utiliser avec npm:
Voici également des exemples de code de son fichier Lisezmoi
la source
Réponse JavaScript pure pour trier un objet. C'est la seule réponse que je connaisse qui traitera les nombres négatifs. Cette fonction permet de trier des objets numériques.
Input obj = {1000: {}, -1200: {}, 10000: {}, 200: {}};
La sortie sera un objet trié par ces nombres avec de nouvelles clés commençant à 0.
la source
Juste pour simplifier et rendre plus claire la réponse de Matt Ball
la source
Je ne sais pas si cela répond à la question, mais c'est ce dont j'avais besoin.
Appelé comme:
la source
La seule ligne:
la source
la meilleure façon de le faire est
Vous pouvez d'abord convertir votre objet quasi-tableau en un vrai tableau, puis utiliser .reverse ():
L'emplacement vide à la fin est dû au fait que votre premier index est 1 au lieu de 0. Vous pouvez supprimer l'emplacement vide avec .length-- ou .pop ().
Alternativement, si vous souhaitez emprunter .reverse et l'appeler sur le même objet, il doit s'agir d'un objet de type tableau complet. Autrement dit, il a besoin d'une propriété de longueur:
Notez qu'il renverra le même objet objet de type tableau complet, donc ce ne sera pas un vrai tableau. Vous pouvez ensuite utiliser delete pour supprimer la propriété length.
la source