Javascript naturel de tri de tableau/objet et de maintenir l'indice de l'association
J'ai un tableau d'éléments comme suit en Javascript:
var users = Array();
users[562] = 'testuser3';
users[16] = 'testuser6';
users[834] = 'testuser1';
users[823] = 'testuser4';
users[23] = 'testuser2';
users[917] = 'testuser5';
J'ai besoin de trier ce tableau pour obtenir le résultat suivant:
users[834] = 'testuser1';
users[23] = 'testuser2';
users[562] = 'testuser3';
users[823] = 'testuser4';
users[917] = 'testuser5';
users[16] = 'testuser6';
Remarquez comment il est triée en fonction de la valeur du tableau et la valeur de l'indice de l'association est maintenue après le tableau est trié (c'est essentiel). J'ai cherché une solution à ce, déjà essayé de le faire, mais a frappé un mur.
Par ailleurs, je suis conscient que ce n'est techniquement pas un tableau, puisque cela voudrait dire que les indices sont toujours itération de 0 à n, où n+1 est le comptage du nombre instance n. Vous avez toutefois la définir, l'exigence pour le projet est toujours le même. Aussi, si cela fait une différence, je ne suis PAS à l'aide de jquery.
Vous devez vous connecter pour publier un commentaire.
L'ordre des éléments d'un tableau est défini par l'indice. Donc, même si vous spécifiez les valeurs dans un ordre différent, les valeurs seront toujours stockées dans l'ordre de leurs indices et undefined index sont
undefined
:Maintenant, si vous voulez stocker la paire de l'index et la valeur, vous aurez besoin d'une autre structure de données, peut-être un tableau de tableau comme ceci:
Cela peut être triée avec cette fonction de comparaison:
Le résultat est ce tableau:
Si je comprends correctement à la question, vous êtes à l'aide de tableaux d'une manière qu'ils ne sont pas destinés à être utilisés. En fait, l'initialisation de style
enseigne mal de choses sur la nature et l'objet de tableaux. Un tableau est une liste ordonnée d'éléments, indexé à partir de zéro. La bonne façon de créer un tableau avec une littéral de tableau:
Les indices sont implicites dans l'ordre les éléments sont spécifiés. La création d'un tableau et de réglage
users[562] = 'testuser3'
implique qu'il y a au moins 562 autres utilisateurs dans la liste, et que vous avez une raison pour en connaissant seulement la 563rd en ce moment.Dans votre cas, l'indice est données, et ne représente pas l'ordre des éléments dans le jeu. Ce que vous cherchez est une carte ou un dictionnaire, représenté en JavaScript par un objet ordinaire:
Maintenant votre ne dispose pas d'un ordre, mais n'ont de sens clés. De là, vous pouvez suivre galambalazs conseils pour créer un tableau de l'objet clés:
...puis de les trier:
Voici une démo
Vous ne pouvez pas commander des tableaux comme ça en Javascript. Votre meilleur pari est de faire un carte de commande.
De cette façon, vous pouvez avoir n'importe quel ordre que vous voulez, indépendamment de l'clés dans le tableau d'origine.
Pour trier votre tableau à l'utilisation d'un personnalisé fonction de tri.
[Démo]
En utilisant les idées les commentaires, je suis venu avec la solution suivante. Le naturalSort fonction est quelque chose que j'ai trouvé sur google et je l'ai modifié pour trier un tableau multidimensionnel. En gros, j'ai fait les utilisateurs de tableau un tableau multidimensionnel avec le premier indice de l'id utilisateur et le deuxième indice étant le nom d'utilisateur. Donc:
J'ai ensuite trié le tableau pour obtenir la sortie suivante:
Le code pour faire cela est ci-dessous:
users
tableau dans votre exemple de code beaucoup plus rapide:var users = [['72', 'testuser4'], ['91', 'testuser2'], …]
localeCompare
:['Foo', 'foo', 'aardvark', 'Baardvark'].sort(function(a, b){ return a.toLowerCase().localeCompare(b.toLowerCase()) }) -> ["aardvark", "Baardvark", "Foo", "foo"]
J'avais utilisation de la carte une fois pour faire un nouveau groupe d'utilisateurs,
puis une seconde fois pour revenir à la chaîne que vous voulez à partir de la nouvelle matrice.
Si vous voulez éviter les lacunes. utiliser un simple filtre sur la sortie-
Matrices creuses généralement source de difficultés. Vous êtes mieux de sauver des paires clé-valeur dans un tableau comme des objets (cette technique est aussi valable JSON):
Comme l'a suggéré, vous pouvez utiliser une boucle for pour mapper la fonction de tri sur le tableau.
Array.le prototype.sort()
prend une option personnalisée fonction de comparaison -- donc, si vous dump l'ensemble de vosusers
dans un tableau de cette manière[ [562, "testuser3"], [16, "testuser6"] ... etc.]
Puis
sort
ce tableau avec la fonction suivante:Puis reconstruire votre
users
objet. (Qui va perdre des vous votre le tri). Ou, conserver les données dans le nouveau tableau trié de tableaux, si cela fonctionnera pour votre application.