Avant de demander; il y a un tas de discussions sur ce sujet particulier, dont la plupart concernent ES5 et ne tiennent pas nécessairement la vérité pour ES6. J'essaie d'obtenir des éclaircissements, et peut-être d'aider la prochaine personne qui parcourt Internet à la recherche d'une réponse. Ceci fait spécifiquement référence à ES6 .
Considérez la structure d'objet suivante:
'0001': '13.1666' '0004': '13.1666' '0002': '11.0001' '0003': '10.6664' '0005': '7.3331'
Comment puis-je trier un objet JavaScript par clé? (Réponse ici )
const unsorted_object = { '0001': '13.1666', '0002': '11.0001', '0003': '10.6664', '0004': '13.1666', '0005': '7.3331', };
Comment puis-je trier un objet JavaScript par valeur de clé?
Je n'ai peut-être pas été tout à fait clair sur la question # 2. L'idée est de trier l'objet JavaScript par la valeur de la clé, pas par clé et valeur.
const sorted_object = {}; Object.keys(unsorted_object).sort().forEach(function(key) { sorted_object[key] = unsorted_object[key]; });
Sortie:
const unsorted_object = { 'C': '0003', 'D': '0004', 'A': '0001', 'B': '0002', 'F': '0005', };
3 Réponses :
Extraire les entrées
au lieu des clés
, puis trier
par la différence de chaque valeur:
const unsorted_object = { 'C': '0003', 'D': '0004', 'A': '0001', 'B': '0002', 'F': '0005', }; const sorted_object = Object.entries(unsorted_object) .sort((a, b) => a[1] - b[1]) .reduce((a, [key, val]) => { a[key] = val; return a; }, {}); console.log(sorted_object);
Notez qu'il est probablement plus approprié d'utiliser reduction
pour construire un objet à partir d'un tableau:
const unsorted_object = { 'C': '0003', 'D': '0004', 'A': '0001', 'B': '0002', 'F': '0005', }; const sorted_object = {}; Object.entries(unsorted_object) .sort((a, b) => a[1] - b[1]) .forEach(([key, val]) => { sorted_object[key] = val; }); console.log(sorted_object);
Vous pouvez trier entrées
et utiliser un reduction ()
pour créer un nouvel objet.
Cela dit, il y a probablement quelque chose qui ne va pas dans la conception de votre application pour avoir besoin de même faire une telle opération
const unsorted_object = { 'C': '0003', 'D': '0004', 'A': '0001', 'B': '0002', 'F': '0005', }; const sorted = Object.entries(unsorted_object) .sort((a, b) => a[1] - b[1]) .reduce((a, c) => (a[c[0]] = c[1], a), {}) console.log(sorted)
Je ne sais pas pourquoi cela a été voté à la baisse, un aperçu serait bien.
@artomason quelqu'un a traversé et a très rapidement voté contre toutes les réponses initiales. Cela arrive ... on ne peut pas faire grand-chose à ce sujet. Si vous pensez que c'est faux, vous avez le pouvoir de voter pour
Les clés d'objets dans ES6 ont un ordre de parcours. Les clés entières sont toujours les premières et sont triées par ordre croissant (0 -> 9). Dans les clés non entières, l'ordre d'affectation est conservé (voir cet article a>). Pour trier les clés de l'objet, nous devons recréer l'objet et ajouter les clés dans l'ordre requis. Remarque: Cela signifie que le tri ne fonctionnera que sur les clés non entières, car les entiers sont toujours premiers , et toujours triés par ordre croissant. Pour trier et recréer l'objet: Si pris en charge, vous pouvez créer l'objet à partir des entrées en utilisant Version compatible Edge, qui utilise
Object.entries ()
pour obtenir un tableau de paires clé / valeur - [[clé, valeur], [clé, valeur]]
[ v1]
. Convertissez les chaînes en nombre à l'aide de l'opérateur +
, [k, v]
, et ajoutez-les à l'objet accumulateur en utilisant noms de propriétés calculés - ({[k]: v})
et propagation d'objets - ({... r , [k]: v})
const unsorted_object = {
'0001': '13.1666',
'0002': '11.0001',
'0003': '10.6664',
'0004': '13.1666',
'0005': '7.3331',
};
const sorted_object = Object.entries(unsorted_object)
.sort(([,v1], [,v2]) => +v2 - +v1)
.reduce((r, [k, v]) => Object.assign(r, { [k]: v }), {});
console.log(sorted_object);
Object.fromEntries ()
au lieu de Array.reduce()
:const unsorted_object = {
'0001': '13.1666',
'0002': '11.0001',
'0003': '10.6664',
'0004': '13.1666',
'0005': '7.3331',
};
const sorted_object = Object.fromEntries(
Object.entries(unsorted_object)
.sort(([,v1], [,v2]) => +v2 - +v1)
);
console.log(sorted_object);
Object.assign ()
au lieu de spread: const unsorted_object = {
'0001': '13.1666',
'0002': '11.0001',
'0003': '10.6664',
'0004': '13.1666',
'0005': '7.3331',
};
const sorted_object = Object.entries(unsorted_object)
.sort(([,v1], [,v2]) => +v2 - +v1)
.reduce((r, [k, v]) => ({ ...r, [k]: v }), {});
console.log(sorted_object);
Je suis assez nouveau en JavaScript, pourriez-vous nous expliquer un peu plus votre réponse. il y a une syntaxe que je ne comprends pas. Par exemple, .sort (([ v1], [ v2]) =>
et ...
.
Merci pour la mise à jour. J'essaie toujours de traiter un peu plus les informations, mais est-il possible de trier par ordre décroissant (valeur) en utilisant la même méthode? Vous avez parlé de clés, mais je ne sais pas si cela s'applique également à la valeur.
Vous triez les paires à l'aide des valeurs, puis vous utilisez les paires pour recréer l'objet dans l'ordre trié. Voir la réponse mise à jour (triée par valeurs décroissantes).
Je ne pouvais pas faire fonctionner cela correctement, mais j'ai également remarqué que ce n'est en fait pas ce que je cherchais, je pense lol. Je cherche à trier l'objet par JUSTE la valeur de la question n ° 2. On dirait que je demandais la clé et la valeur. Je ne sais pas si c'est ainsi que vous l'avez interprété.
Veuillez ajouter un exemple du résultat demandé.
J'ai mis à jour la question. Veuillez consulter la modification n ° 2. Merci!
… Et il semble que ce soit en fait le comportement attendu car les nombres ne sont pas des entiers, ce sont des décimales. Serait-il préférable de supprimer la décimale avant de comparer? Bien que je soupçonne qu'un nombre décimal tel que 13,1 pourrait finir plus haut que 13,4 si tel est le cas.
Si les clés étaient entières, le comportement aurait été différent (lire l'article dans le lien). Ne laissez pas tomber les décimales, convertissez-les en nombres. Voir la réponse mise à jour.
Merci pour la mise à jour. Le code semble générer une erreur. Voici le jsfiddle jsfiddle.net/8yxf376p/3 ; le même problème se produit dans le navigateur (edge et firefox).
Cela fonctionne bien sur Firefox. Edge ne prend pas en charge la propagation d'objets, je l'ai donc remplacé par Object.assign. Voir la mise à jour.
@Winston - merci, mais Object.fromEntries ()
est utilisé dans la 2ème solution. De plus, Object.fromEntries ()
ne fait pas partie d'ES6, il a été publié avec ECMAScript 2019.
Pourquoi voulez-vous trier un objet (ils ne sont pas ordonnés par conception)? Pouvez-vous expliquer ce que vous voulez faire dans son ensemble?
@JBallin Dans ES6 +, les propriétés d'objet sont ordonnées - c'est uniquement dans ES5 et avant cela, elles n'ont pas d'ordre défini.
Double possible de Trier un objet JavaScript par valeur de propriété
@JBallin Je ne suis pas d'accord. Je pense que la question, posée en 2010, a reçu une réponse dans le cadre de l'ES5 et n'est donc pas spécifique à l'ES6.
@artomason certaines réponses utilisent ES6. Si vous pensez vraiment que c'est différent, vous devez modifier votre titre pour qu'il soit spécifique à ES6.
@CertainPerformance intéressant, je n'ai pas réalisé. Mais quand même, je pense qu'OP devrait expliquer le cas d'utilisation.
@JBallin dans la plupart des cas, la nécessité de trier est un élément fondamental inhérent au travail avec des structures de données. Avec la publication de la spécification ES6; ceci peut maintenant être accompli de manière plus optimale que celle détaillée dans les questions précédentes. Dans mon scénario d'utilisation spécifique, je supprimerai les touches
n
inférieures (les plus basses).@JBallin Je voudrais également souligner que les réponses à cette question qui sont similaires à la réponse "en double" ont été votées ici.
@artomason eh bien votre réflexion n'est pas irrationnelle mais rien de vraiment changé à part codifier que les clés d'objet sont censées être présentées dans l'ordre dans lequel elles ont été ajoutées à l'objet. Ce n'est pas directement sous votre contrôle sans un code vraiment fragile. Il est beaucoup plus sûr d'appliquer votre propre ordre en triant explicitement les clés (sous forme de tableau) lorsque vous en avez besoin.
@artomason Pourquoi ne supprimeriez-vous pas les touches les plus basses avant de les reconvertir en objet?
Object.entries (obj) .sort (). slice (n) .reduce ((o, [k, v]) => ({... o, [k]: v}), {})
La réponse la plus votée ici est assez similaire à la réponse que j'ai liée.
Voici un cas d'utilisation intéressant où le tri d'un objet par valeur pourrait avoir un sens: stackoverflow.com/a/53661894/4722345