Como classificar uma matriz com base no comprimento de cada elemento?

95

Eu tenho uma matriz como esta:

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

Após a classificação, a matriz de saída deve ser:

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

Quer dizer, eu quero na ordem decrescente do comprimento de cada elemento.

ramesh kumar
fonte
1
sorté bem direto, onde você está tendo dificuldade?
mu é muito curto
4
@muistooshort bem padrão sort () classifica as strings alfabeticamente, ele estava procurando pela classificação string.length como pode ser visto na resposta escolhida :)
jave.web

Respostas:

231

Você pode usar o Array.sortmétodo para classificar a matriz. Uma função de classificação que considera o comprimento da string como o critério de classificação pode ser usada da seguinte maneira:

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

Nota: a classificação ["a", "b", "c"]pelo comprimento da string não tem garantia de retorno ["a", "b", "c"]. De acordo com as especificações :

A classificação não é necessariamente estável (ou seja, os elementos que se comparam igual não permanecem necessariamente em sua ordem original).

Se o objetivo é classificar por comprimento, por ordem de dicionário, você deve especificar critérios adicionais:

["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
});
Salman A
fonte
Eu acrescentaria que isso classifica a matriz diminuindo o comprimento dos itens.
davidhq
aha está no comentário :) não vi a princípio
davidhq
Apenas para adicionar uma informação. Este snippet não funcionará para todos os casos.
Arunkumar Srisailapathi de
Tente arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'], vai falhar
Arunkumar Srisailapathi
15
A maneira ES6arr.sort((a, b) => b.length - a.length)
Fergal
4

Podemos usar o método Array.sort para classificar esse array.

Solução ES5

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

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

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

Para ordem de classificação crescente :a.length - b.length

Para ordem de classificação decrescente :b.length - a.length

Solução ES6

Atenção: nem todos os navegadores podem entender o código ES6!

No ES6, podemos usar expressões de função de seta .

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

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

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

Bharata
fonte
3

Esta é a classificação, dependendo do comprimento de uma string com javascript, conforme você pediu:

[a solução do problema por tipo de bolha] [1]

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

Shareef
fonte
0

Com base na resposta de Salman, escrevi uma pequena função para encapsulá-lo:

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
        });
    }

então é só ligar com

sortArrayByLength( myArray, true );

Observe que, infelizmente, funções podem / não devem ser adicionadas ao protótipo do Array, conforme explicado nesta página .

Além disso, ele modificou o array passado como parâmetro e não retorna nada. Isso forçaria a duplicação do array e não seria ótimo para arrays grandes. Se alguém tiver uma ideia melhor, por favor, comente!

Nico
fonte
0

Adaptei a resposta de @shareef para torná-la concisa. Eu uso,

.sort(function(arg1, arg2) { return arg1.length - arg2.length })


fonte
isso classificaria de comprimento baixo para comprimento maior
Miguel
0
#created a sorting function to sort by length of elements of list
def sort_len(a):
    num = len(a)
    d = {}
    i = 0
    while i<num:
        d[i] = len(a[i])
        i += 1
    b = list(d.values())
    b.sort()
    c = []
    for i in b:
        for j in range(num):
            if j in list(d.keys()):
                if d[j] == i:
                    c.append(a[j])
                    d.pop(j)
    return c
Rishabh Gupta
fonte
1
Publicar o código sozinho não ajudará. Dê uma breve descrição do que seu código faz.
coderpc
-1

Este código deve fazer o truque:

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

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

console.log(JSON.stringify(array, null, '\t'));
Hiền
fonte
-3
<script>
         arr = []
         arr[0] = "ab"
         arr[1] = "abcdefgh"
         arr[2] = "sdfds"
         arr.sort(function(a,b){
            return a.length<b.length
         })
         document.write(arr)

</script>

A função anônima que você passa para classificar diz a ele como classificar o array fornecido. Espero que isso ajude. Sei que isso é confuso, mas você pode dizer à função de classificação como classificar os elementos do array passando-lhe uma função como um parâmetro informando é o que fazer

Cientista maluco
fonte
5
O que a função de comparação de classificação deve retornar? Aqui está uma dica: não é um booleano.
mu é muito curto