Classement des éléments du tableau
J'ai besoin d'un algorithme pour classer les éléments d'un tableau en Javascript.
Exemple : j'ai un tableau comme suit:
[79, 5, 18, 5, 32, 1, 16, 1, 82, 13]
J'ai besoin de classer les entrées en valeur. Donc, 82 devraient recevoir de rang 1, 79 rang 2 etc.
Si les deux entrées ont la même valeur qu'ils reçoivent le même rang et le rang pour une valeur inférieure est soulevée.
Donc, pour ce tableau, le nouveau classement de la matrice serait de:
[2, 7, 4, 7, 3, 9, 5, 9, 1, 6]
Comment puis-je faire cela ?
source d'informationauteur Yùz Nagami | 2013-02-12
Vous devez vous connecter pour publier un commentaire.
Résultat :
Si vous souhaitez être compatible avec les anciens navigateurs, vous pouvez avoir à définir une cale pour indexOf et pour carte (notez que si vous voulez le faire très vite pour de très grands tableaux, vous feriez mieux d'utiliser
for
boucles et l'utilisation d'un objet sous forme de cartes au lieu deindexOf
).Cela ne fonctionne pas avec les anciens navigateurs, car il utilise ECMAScript 5 caractéristiquesmais il vous permet de rapidement et de manière succincte, de produire un tableau de classement, même pour de très grands réseaux. (Il n'utilise pas
indexOf
qui fait une recherche linéaire et peut donc être lent pour de grands tableaux.)Exemple de sortie:
Utilisation:
Ressemble un peu moche, mais il n'utilise pas
indexOf()
ou un objet/de la carte, de sorte que non seulement il tourne un peu plus vite, mais plus important encore, il respecte le sens de "même rankedness" tel que défini par la fonction de comparaison. Si l'on utiliseindexOf()
ou un objet, "même rankedness" ne peut signifiera === b
ouString(a) === String(b)
.Vous pouvez également utiliser
findIndex()
:J'avais besoin de le même bout de code pour des opérations de planification script que j'écrivais. J'ai utilisé des objets et de leurs propriétés ou des clés, ce qui peut avoir n'importe quelle valeur et peut être consulté chaque fois que nécessaire. Aussi, autant que j'ai lu dans certains articles, la recherche de propriétés dans les objets peuvent être plus rapides que la recherche dans des tableaux.
Le script ci-dessous a trois étapes simples:
trier les valeurs (ascendant ou descendant n'a pas d'importance pour le reste du script)
trouver le rang et le nombre d'occurrences de chaque valeur
remplacer les valeurs données avec des rangs en utilisant les données à partir de l'étape 2
Remarque! Le script ci-dessous ne seront pas de sortie en double rangs, mais plutôt par incréments de rangs pour les valeurs en double/éléments.
J'ai aussi besoin de faire autre chose pour mon script.
Au-dessus de la sortie a la signification suivante:
index - l'ID de l'élément dans le tableau d'entrée
valeur - le rang de l'élément du tableau input
Et j'ai besoin d'fondamentalement d'échange de l'indice par la valeur", de sorte que j'ai une liste d'élément Id d', disposées dans l'ordre de leur rang:
Et quelques exemples:
ToBeRanked:
[36, 33, 6, 26, 6, 9, 27, 26, 19, 9]
[12, 12, 19, 22, 13, 13, 7, 6, 13, 5]
[30, 23, 10, 26, 18, 17, 20, 23, 18, 10]
[7, 7, 7, 7, 7, 7, 7, 7, 7, 7]
[7, 7, 7, 7, 7, 2, 2, 2, 2, 2]
[2, 2, 2, 2, 2, 7, 7, 7, 7, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
rankArrayElements( ToBeRanked ):
[0, 1, 8, 3, 9, 6, 2, 4, 5, 7]
[5, 6, 1, 0, 2, 3, 7, 8, 4, 9]
[0, 2, 8, 1, 5, 7, 4, 3, 6, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
convertRanksToListOfElementIDs( rankArrayElements( ToBeRanked ) ):
[0, 1, 6, 3, 7, 8, 5, 9, 2, 4]
[3, 2, 4, 5, 8, 0, 1, 6, 7, 9]
[0, 3, 1, 7, 6, 4, 8, 5, 2, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[5, 6, 7, 8, 9, 0, 1, 2, 3, 4]
[9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
Je ne suis pas bon en Javascript, mais en PHP, il peut être fait très facilement la façon suivante. Quelqu'un de bon en JavaScript peut venir avec le code pertinent.