Essayer d'obtenir la valeur la plus élevée et la plus basse d'un tableau dont je sais qu'il ne contiendra que des entiers semble être plus difficile que je ne le pensais.
var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)
Je m'attendrais à ce que cela se voit 99, 104, 140000
. Au lieu de cela, cela se voit 104, 140000, 99
. Il semble donc que le tri gère les valeurs sous forme de chaînes.
Existe-t-il un moyen d'obtenir la fonction de tri pour trier réellement sur la valeur entière?
javascript
arrays
sorting
numbers
peirix
la source
la source
NaN
. Ce serait bien de voir une réponse très bien classée qui traite deNaN
.Réponses:
Par défaut, la méthode de tri trie les éléments par ordre alphabétique. Pour trier numériquement, ajoutez simplement une nouvelle méthode qui gère les tris numériques (sortNumber, illustré ci-dessous) -
Dans ES6, vous pouvez simplifier cela avec les fonctions fléchées:
Documentation:
Mozilla
Array.prototype.sort()
recommande cette fonction de comparaison pour les tableaux qui ne contiennent pas Infinity ou NaN. (Parce queInf - Inf
c'est NaN, pas 0).Également des exemples de tri d'objets par clé.
la source
numberArray.sort((a, b) => (a - b));
Yay! Je pense que cela est proche de la méthode prête à l'emploi. Remarque: vérifiez si votre moteur JS prend en charge les fonctions fléchées.Sur la base de toutes les réponses ci-dessus, elles peuvent également être effectuées sur une seule ligne comme celle-ci:
la source
var arr = [140000, 104, 99].sort(function(a,b) { return a-b; });
. Ou plus compact, dans ES6let arr = [140000, 104, 99].sort((a,b) => a-b);
function
etreturn
, mais n'utilisez pas réellement le véritable objectif de la fonction flèche de passerthis
. Ce code implique qu'unthis
passage de contexte se produit, mais ce n'est pas le cas. Confus pour les autres développeurs de lire votre code, juste pour enregistrer quelques caractères. Ne dépendez pas des effets secondaires - codez avec un but!this
en quelque sorte dans la fonction, mais ce n'est pas vrai. Il néglige en fait de créer unthis
et laarguments
variable qui écrasent généralement les variables parentes. La seule raison que vous pouvez utiliserthis
dans une fonction de flèche est la portée lexicale.array.sort fait un tri lexicographique par défaut, pour un tri numérique, fournissez votre propre fonction. Voici un exemple simple:
Notez également que le tri fonctionne "sur place", il n'y a pas besoin d'affectation.
la source
Cette réponse est équivalente à certaines des réponses existantes, mais les fonctions de flèche ECMAScript 6 fournissent une syntaxe beaucoup plus compacte qui nous permet de définir une fonction de tri en ligne sans sacrifier la lisibilité:
Il est pris en charge dans la plupart des navigateurs aujourd'hui .
la source
objArray=objArray.sort((a,b)=>a.numProperty - b.numProperty);
et si la propriété est une chaîne, vous pouvez le faire:objArray=objArray.sort((a,b)=>a.strProperty.localeCompare(b.strProperty));
cela étant dit, cette question pose spécifiquement la question du tri d'un tableau d'entiersJe suis surpris que tout le monde recommande de passer une fonction de comparateur à
sort()
, ce qui rend le tri vraiment lent!Pour trier les nombres, créez simplement n'importe quel tableau typé :
la source
La raison pour laquelle la fonction de tri se comporte si bizarrement
De la documentation :
Si vous imprimez les valeurs de points unicode du tableau, cela deviendra clair.
Cela renvoie: "49, 49, 57".
Maintenant, comme 140000 et 104 ont renvoyé les mêmes valeurs (49), il coupe le premier index et vérifie à nouveau:
Si nous trions cela, nous obtiendrons:
donc 104 vient avant 140000.
Le résultat final sera donc:
104, 140000, 99
Conclusion:
sort()
fait le tri en ne regardant que le premier index des nombres.sort()
ne se soucie pas si un nombre entier est plus grand qu'un autre, il compare la valeur de l'unicode des chiffres, et s'il y a deux valeurs unicode égales, il vérifie s'il y a un chiffre suivant et le compare également.Pour trier correctement, vous devez passer une fonction de comparaison
sort()
comme expliqué ici .la source
Je suis d'accord avec aks, cependant au lieu d'utiliser
Tu devrais utiliser
la source
>
et<
toujours comparer a et b en tant que chaînes.Dans le nouveau monde ES6, il est beaucoup plus facile de faire un tri
C'est tout ce dont vous avez besoin :)
la source
En JavaScript, le comportement par défaut de la méthode sort () consiste à trier les valeurs d'un tableau par ordre alphabétique.
Pour trier par numéro, vous devez définir une fonction de tri numérique (ce qui est très simple):
la source
Array.prototype.sort () est la méthode incontournable pour trier les tableaux, mais il y a quelques problèmes dont nous devons être conscients.
L'ordre de tri est par défaut lexicographique et non numérique quels que soient les types de valeurs dans le tableau. Même si le tableau contient tous les nombres, toutes les valeurs seront converties en chaîne et triées lexicographiquement.
Devrions-nous donc avoir besoin de personnaliser la méthode sort () et reverse () comme ci-dessous.
URL référée
Pour trier les nombres à l'intérieur du tableau
Pour inverser les nombres à l'intérieur du tableau
URL référée
la source
La question a déjà été répondue, le plus court est d'utiliser la
sort()
méthode. Mais si vous cherchez d'autres façons de trier votre tableau de nombres et que vous aimez aussi les cycles, vérifiez les points suivantsTri par insertion
Ascendant:
Descendant:
Tri de sélection:
Ascendant:
Descendant:
S'amuser
la source
sort()
sur un TypedArray comme cette réponse le suggère . Ils ne seront certainement pas plus rapides pour les tableaux de taille moyenne à grande car ce sont des algorithmes O (n ^ 2).La fonction «numériquement» ci-dessous sert à trier le tableau de nombres numériquement dans de nombreux cas lorsqu'elle est fournie en tant que fonction de rappel:
Mais dans de rares cas, où le tableau contient des nombres très grands et négatifs, une erreur de débordement peut se produire car le résultat de ab devient plus petit que le plus petit nombre auquel JavaScript peut faire face.
Donc, une meilleure façon d'écrire numériquement la fonction est la suivante:
la source
DBL_MIN - DBL_MAX
) mais un dépassement de capacité n'est pas possible. L'annulation catastrophique rend le résultat imprécis, perdant la plupart de ses "chiffres significatifs", maisa-b
sera toujours non nul et aura le bon signe pour a! = B.pour gérer undefined, null et NaN: Null se comporte comme 0, NaN et undefined va se terminer.
la source
Pour un tableau normal de valeurs d'éléments uniquement:
Pour un tableau d'objets:
la source
Ma forme préférée personnelle de cette fonction permet un paramètre pour Ascendant ou Descendant:
Utilisation aussi simple que:
jsFiddle
Ou exemple d'extrait de code ici!
.smartSort ('asc' | 'desc')
Maintenant, amusez-vous encore plus avec une méthode de tri qui trie un tableau plein de plusieurs éléments! Ne couvre pas actuellement "associatif" (aka, clés de chaîne), mais il couvre tous les types de valeur! Non seulement il triera les valeurs multiples
asc
ou endesc
conséquence, mais il maintiendra également une "position" constante des "groupes" de valeurs. En d'autres termes; les entiers sont toujours les premiers, puis viennent les chaînes, puis les tableaux (oui, je fais cela multidimensionnel!), puis les objets (non filtrés, élément, date), et enfin les indéfinis et les nuls!"Pourquoi?" tu demandes. Pourquoi pas!
Maintenant disponible en 2 saveurs! Le premier nécessite des navigateurs plus récents car il utilise
Object.defineProperty
pour ajouter la méthode à l'Array.protoype
objet. Cela permet de faciliter la naturelle utilisation, tels que:myArray.smartSort('a')
. Si vous avez besoin d'implémenter pour des navigateurs plus anciens, ou si vous n'aimez tout simplement pas modifier des objets natifs, faites défiler jusqu'à la version Méthode uniquement .jsFiddle Array.prototype.smartSort ('asc | desc')
L'utilisation est simple! Faites d'abord un tableau fou comme:
Ensuite, triez-le simplement!
Méthode uniquement
Identique à la précédente, sauf comme une simple méthode!
Utilisation:
jsFiddle, méthode smartSort (tableau, "asc | desc")
la source
Essayez ce code:
HTML:
Code JavaScript:
la source
Essayez ce code comme ci-dessous
la source
la source
Bien que cela ne soit pas requis en JavaScript, si vous souhaitez que strictement retourner -1, 0 ou 1 (similaire à la façon dont l' opérateur de vaisseau spatial fonctionne en PHP), vous pouvez l'utiliser .
sort()
compareFunction
Math.sign()
Ce qui
compareFunction
suit renvoie strictement -1, 0 ou 1:la source
Voici la solution déjà proposée et acceptée comme méthode sur le prototype Array:
la source
Comme la méthode de tri convertit les éléments du tableau en chaîne. Donc, ci-dessous fonctionne également très bien avec des nombres décimaux avec des éléments de tableau.
Et vous donne le résultat attendu.
la source
Substitution de la méthode de tri.
la source
La fonction de tri par défaut est le tri dans l'ordre du dictionnaire:
Celui ci-dessus n'est pas le cas que nous voulons pour les chiffres. Donc, si vous avez des entiers et que la fonction de tri par défaut ne fonctionne pas (car elle trie dans l'ordre du dictionnaire), vous devez implémenter votre propre fonction:
J'espère que vous avez une question en tête: comment ça marche? Ici, lorsque nous fournissons une méthode dans la fonction de tri, il passe à chaque fois deux nombres et si le nombre revient
En suivant ceci pour tous les nombres, il trie le tableau d'entiers.
Si vous utilisez ES6, écrivez une fonction de flèche:
la source
Voici ma fonction de tableau de tri dans la bibliothèque d'utils:
la source
a-b
devrait être utilisé à la place. (Vous pouvez avoir de la fantaisie et faire unNumber(a>b)-0.5
, mais ce n'est toujours pas un type stable).