web-dev-qa-db-fra.com

Comment trier un tableau en fonction de la longueur de chaque élément?

J'ai un tableau comme celui-ci: 

arr = []
arr[0] = "ab"
arr[1] = "abcdefgh"
arr[2] = "abcd"

Après le tri, le tableau de sortie doit être:

arr[0] = "abcdefgh"
arr[1] = "abcd"
arr[2] = "ab"  

Je veux dire, je veux dans l'ordre décroissant de la longueur de chaque élément.

70
ramesh kumar

Vous pouvez utiliser Array.sort pour trier le tableau. Une fonction de tri qui considère la longueur de la chaîne comme critère de tri peut être utilisée comme suit:

arr.sort(function(a, b){
  // ASC  -> a.length - b.length
  // DESC -> b.length - a.length
  return b.length - a.length;
});

Remarque: le tri de ["a", "b", "c"] par longueur de chaîne n'est pas garanti pour renvoyer ["a", "b", "c"]. Selon les spécifications :

La sorte n'est pas nécessairement stable (c'est-à-dire que les éléments qui se comparent Égaux ne restent pas nécessairement dans leur ordre d'origine).

Si l'objectif est de trier par longueur puis par ordre du dictionnaire, vous devez spécifier des critères supplémentaires:

["c", "a", "b"].sort(function(a, b) {
  return a.length - b.length || // sort by length, if equal then
         a.localeCompare(b);    // sort by dictionary order
});
175
Salman A

Voici le type, en fonction de la longueur d'une chaîne avec javascript comme vous l'avez demandé:

[la solution du problème par type de bulle] [1]

[1]: http://jsfiddle.net/sssonline2/vcme3/2/enter code here

3
shareef

Nous pouvons utiliser la méthode Array.sort pour trier ce tableau.

Solution ES5

var array = ["ab", "abcdefgh", "abcd"];

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

console.log(JSON.stringify(array, null, '\t'));

Pour l'ordre de tri croissant: a.length - b.length

Pour ordre de tri décroissant: b.length - a.length

Solution ES6

Attention: tous les navigateurs ne peuvent pas comprendre le code ES6!

Dans ES6, nous pouvons utiliser une expression de fonction flèche.

let array = ["ab", "abcdefgh", "abcd"];

array.sort((a, b) => b.length - a.length);

console.log(JSON.stringify(array, null, '\t'));

2
Bharata

Sur la base de la réponse de Salman, j'ai écrit une petite fonction pour l'encapsuler: 

function sortArrayByLength(arr, ascYN) {
        arr.sort(function (a, b) {           // sort array by length of text
            if (ascYN) return a.length - b.length;              // ASC -> a - b
            else return b.length - a.length;                    // DESC -> b - a
        });
    }

alors il suffit d'appeler avec

sortArrayByLength( myArray, true );

Notez que, malheureusement, des fonctions ne peuvent/ne doivent pas être ajoutées au prototype Array, comme expliqué à cette page .

De plus, il a modifié le tableau passé en paramètre et ne renvoie rien. Cela forcerait la duplication du tableau et ne serait pas génial pour les grands tableaux. Si quelqu'un a une meilleure idée, veuillez commenter!

0
Nico