Comment trier un tableau associatif par ses valeurs en Javascript?
J'ai le tableau associatif:
array["sub2"] = 1;
array["sub0"] = -1;
array["sub1"] = 0;
array["sub3"] = 1;
array["sub4"] = 0;
Quelle est la façon la plus élégante de tri (ordre décroissant) par ses valeurs, où le résultat serait un tableau avec des indices respectifs dans cet ordre:
sub2, sub3, sub1, sub4, sub0
?
- Depuis les propriétés de l'objet ont pas de langage ordre défini, vous ne pouvez pas (sauf, peut-être, dans certains JS moteurs en fonction de la manière dont elles ont mis en œuvre des propriétés).
Vous devez vous connecter pour publier un commentaire.
Javascript n'a pas de "tableaux associatifs" de la façon dont vous pensez à eux. Au lieu de cela, vous avez simplement la possibilité de définir les propriétés de l'objet à l'aide de la matrice de syntaxe (comme dans votre exemple), ainsi que la possibilité d'itérer sur les propriétés d'un objet.
La conséquence de cela est qu'il n'y a aucune garantie quant à la ordre dans lequel vous itérer sur les propriétés, donc il n'y a rien comme une sorte pour eux. Au lieu de cela, vous aurez besoin de convertir vos propriétés de l'objet dans un "vrai" tableau (qui n'est garant de l'ordre). Voici un extrait de code pour la conversion d'un objet dans un tableau de deux n-uplets (deux éléments de tableaux), le tri de ce que vous décrivez, puis en itérant sur elle:
Vous pouvez trouver qu'il est plus naturel de conclure à une fonction qui prend un rappel:
JS:
HTML:
Au lieu de corriger vous sur la sémantique d'un tableau associatif", je pense que c'est ce que vous voulez:
pour vraiment vieux navigateurs, utilisez ceci à la place:
Vous dump dans un objet (comme le vôtre) et d'obtenir un tableau de clés - eh propriétés - retour, triés en ordre décroissant par le (numérique) valeur de l', hein, les valeurs de l', hein, de l'objet.
Cela ne fonctionne que si vos valeurs sont numériques. Ajustez le petit
function(a,b)
là pour changer le mécanisme de tri pour le travail croissant, ou travailler pourstring
valeurs (par exemple). Laissé comme exercice pour le lecteur.La poursuite de la discussion & autres solutions couverts à Comment trier un (associatif) tableau par valeur? avec la meilleure solution (pour mon cas) par saml (cité ci-dessous).
Les tableaux peuvent seulement avoir des indices numériques. Vous auriez besoin de réécrire ce que ce soit un Objet ou un Tableau d'Objets.
Si vous aimez la
status.push
méthode, vous pouvez les trier avec:sort()
les traite différemment. Il a sali moi pendant une heure jusqu'à ce que j'ai trouvé ce stackoverflow.com/questions/6712034/... Exemple;a.name.toLowerCase() > b.name.toLowerCase()
Il n'y a vraiment aucune une telle chose comme un "tableau associatif" en JavaScript. Ce que vous avez, il y a une plaine de l'ancien objet. Ils travaillent genre de comme des tableaux associatifs, bien sûr, et les clés sont disponibles mais il n'y a pas de sémantique autour de la commande de touches.
Vous pourriez faire de votre objet dans un tableau d'objets (des paires clé/valeur) et de sorte que:
Alors vous feriez appel à un comparateur de fonction.
Ici est une variante de ben en blanc de la réponse, si vous n'aimez pas les tuples.
Cela vous permet d'économiser quelques caractères.
Aucune complication inutile requis...
var stuff = {"a":1 , "b":3 , "c":0 } sortMapByValue(stuff) [Array[2], Array[2], Array[2]]
j'utilise $.chacun de jquery mais vous pouvez le faire avec une boucle for, une amélioration est ceci:
Alors maintenant, vous pouvez faire
La meilleure approche pour le cas spécifique ici, à mon avis, est l'un commonpike suggéré. Un peu d'amélioration, je vous suggère de qui fonctionne dans les navigateurs modernes est:
Cela pourrait s'appliquer facilement et de l'excellent travail dans le cas spécifique ici, de sorte que vous pouvez faire:
En plus de cela, j'ai ici une de plus "générique" de la fonction que vous pouvez utiliser pour trier, même dans le plus large éventail de situations et qui se mélange à l'amélioration j'ai juste suggéré avec les approches de réponses en Ben Vide (également le tri des valeurs de chaîne) et PopeJohnPaulII (tri par champ d'objet/propriété) et à vous de décider si vous voulez un ascendant ou descendant de l'ordre, c'est ici:
Vous pouvez tester les fonctionnalités d'essayer quelque chose comme le code suivant:
Comme je l'ai déjà dit, vous pouvez passer en boucle triés clés si vous avez besoin de faire le fourre
Dernier, mais non le moins, quelques références utiles pour Objet.touches et Tableau.tri
Juste; c'est donc là et que quelqu'un est à la recherche d'un tuple base de toutes sortes.
Cela permettra de comparer le premier élément de l'objet dans le tableau, que le deuxième élément, et ainsi de suite. j'.e dans l'exemple ci-dessous, il compare d'abord par "a", puis par "b" et ainsi de suite.
OUPUTS
@commonpike la réponse est "la bonne", mais comme il se passe de commentaire...
Ouais..
Object.keys()
est mieux.Mais ce qui est encore mieux? Bah, c'est dans
coffeescript
!