Question Comment trier correctement un tableau d'entiers


Essayer d'obtenir la valeur la plus haute et la plus basse d'un tableau que je sais ne contiendra que des nombres entiers semble être plus difficile que je le pensais.

var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)

Je m'attends à ce que cela montre 99, 104, 140000. Au lieu de cela montre 104, 140000, 99. Il semble donc que le tri manipule les valeurs sous forme de chaînes.

Existe-t-il un moyen d'obtenir que la fonction de tri trie réellement la valeur entière?


512
2018-06-30 10:43


origine


Réponses:


Par défaut, la méthode de tri trie les éléments par ordre alphabétique. Pour trier numériquement il suffit d'ajouter une nouvelle méthode qui gère les tris numériques (sortNumber, montré ci-dessous) -

function sortNumber(a,b) {
    return a - b;
}

var numArray = [140000, 104, 99];
numArray.sort(sortNumber);
alert(numArray.join(","));

EDIT: utilisation des fonctions flèches ES6:

numArray.sort((a, b) => a - b); // For ascending sort
numArray.sort((a, b) => b - a); // For descending sort

729
2018-06-30 10:47



Construire sur toutes les réponses ci-dessus, ils peuvent également être fait dans une ligne comme ceci:

var numArray = [140000, 104, 99];

// ES5
numArray = numArray.sort(function (a, b) {  return a - b;  });

// ES2015
numArray = numArray.sort((a, b) => a - b);

//outputs: 99, 104, 140000

132
2018-02-06 06:07



tableau.sort effectue un tri lexicographique par défaut, pour un tri numérique, fournit votre propre fonction. Voici un exemple simple:

function compareNumbers(a, b)
{
    return a - b;
}

numArray.sort(compareNumbers);

Notez également que le tri fonctionne "en place", il n'y a pas besoin de l'affectation.


63
2018-06-30 10:47



Cette réponse équivaut à certaines des réponses existantes, mais ECMAScript 6 fonctions de flèche fournir une syntaxe beaucoup plus compacte qui nous permet de définir une fonction de tri en ligne sans sacrifier la lisibilité:

numArray = numArray.sort((a, b) => a - b);

Il est pris en charge dans la plupart des navigateurs aujourd'hui.


32
2018-02-03 20:07



Je suis d'accord avec aks, mais au lieu d'utiliser

return a - b;

Tu devrais utiliser

return a > b ? 1 : a < b ? -1 : 0;

16
2018-06-30 10:48



En JavaScript, le comportement par défaut de la méthode sort () est de trier les valeurs dans 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 facile):

...
function sortNumber(a, b)
{
  return a - b;
}

numArray = numArray.sort(sortNumber);

10
2018-03-02 07:53



Array.prototype.sort () est la méthode de tri pour les tableaux, mais nous avons besoin de connaître quelques problèmes.

L'ordre de tri est par défaut lexicographique et non numérique indépendamment des types de valeurs du tableau. Même si le tableau est tous des nombres, toutes les valeurs seront converties en chaîne et triées lexicographiquement.

Alors devrions-nous avoir besoin de personnaliser la méthode sort () et reverse () comme ci-dessous.

URL référencée

Pour trier les nombres dans le tableau

numArray.sort(function(a, b)
{
    return a - b;
});

Pour inverser les nombres à l'intérieur du tableau

numArray.sort(function(a, b)
{
    return b - a;
});

URL référencée


8
2018-05-26 07:07



La raison pour laquelle la fonction de tri se comporte de manière si étrange

Du Documentation:

[...] le tableau est trié en fonction du point de code Unicode de chaque caractère   valeur, en fonction de la conversion de chaîne de chaque élément.

Si vous imprimez le valeurs de point unicode du tableau alors il deviendra clair.

console.log("140000".charCodeAt(0));
console.log("104".charCodeAt(0));
console.log("99".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"

Cela renvoie: "49, 49, 57".

49 (unicode value of first number at 140000)
49 (unicode value of first number at 104)
57 (unicode value of first number at 99)

Maintenant que 140000 et 104 ont renvoyé les mêmes valeurs (49), il coupe le premier index et vérifie à nouveau:

console.log("40000".charCodeAt(0));
console.log("04".charCodeAt(0));

//Note that we only look at the first index of the number "charCodeAt(  0  )"

52 (unicode value of first number at 40000)
40 (unicode value of first number at 04)

Si nous trions cela, nous obtiendrons:

40 (unicode value of first number at 04)
52 (unicode value of first number at 40000)

donc 104 vient avant 140000.

Le résultat final sera donc:

var numArray = [140000, 104, 99];
numArray = numArray.sort();
console.log(numArray)

104, 140000, 99

Conclusion:

sort() fait le tri en regardant seulement 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 égales d'unicode, alors 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.


5
2018-06-26 18:34



La question a déjà été répondue, le plus court chemin est d'utiliser sort() méthode. Mais si vous cherchez plus de façons de trier votre tableau de nombres, et vous aimez aussi les cycles, vérifiez les points suivants

Tri par insertion

Ascendant:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
    var target = numArray[i];
    for (var j = i - 1; j >= 0 && (numArray[j] > target); j--) {
        numArray[j+1] = numArray[j];
    }
    numArray[j+1] = target
}
console.log(numArray);

Descendant:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length; i++) {
    var target = numArray[i];
    for (var j = i - 1; j >= 0 && (numArray[j] < target); j--) {
        numArray[j+1] = numArray[j];
    }
    numArray[j+1] = target
}
console.log(numArray);

Tri de sélection:

Ascendant:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length - 1; i++) {
    var min = i;
    for (var j = i + 1; j < numArray.length; j++) {
        if (numArray[j] < numArray[min]) {
            min = j;
        }
    }
    if (min != i) {
        var target = numArray[i];
        numArray[i] = numArray[min];
        numArray[min] = target;
    }
}
console.log(numArray);

Descendant:

var numArray = [140000, 104, 99];
for (var i = 0; i < numArray.length - 1; i++) {
    var min = i;
    for (var j = i + 1; j < numArray.length; j++) {
        if (numArray[j] > numArray[min]) {
            min = j;
        }
    }
    if (min != i) {
        var target = numArray[i];
        numArray[i] = numArray[min];
        numArray[min] = target;
    }
}
console.log(numArray);

S'amuser


4
2018-02-07 11:04



Pour un tableau normal de valeurs d'éléments uniquement:

function sortArrayOfElements(arrayToSort) {
    function compareElements(a, b) {
        if (a < b)
            return -1;
        if (a > b)
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareElements);
}

e.g. 1:
var array1 = [1,2,545,676,64,2,24]
**output : [1, 2, 2, 24, 64, 545, 676]**

var array2 = ["v","a",545,676,64,2,"24"]
**output: ["a", "v", 2, "24", 64, 545, 676]**

Pour un tableau d'objets:

function sortArrayOfObjects(arrayToSort, key) {
    function compareObjects(a, b) {
        if (a[key] < b[key])
            return -1;
        if (a[key] > b[key])
            return 1;
        return 0;
    }

    return arrayToSort.sort(compareObjects);
}

e.g. 1: var array1= [{"name": "User4", "value": 4},{"name": "User3", "value": 3},{"name": "User2", "value": 2}]

**output : [{"name": "User2", "value": 2},{"name": "User3", "value": 3},{"name": "User4", "value": 4}]**

2
2018-02-07 10:58