Come ordinare un array in base alla lunghezza di ogni elemento?


96

Ho un array come questo:

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

Dopo l'ordinamento, l'array di output dovrebbe essere:

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

Voglio dire, voglio in ordine decrescente della lunghezza di ogni elemento.


1
sortè abbastanza semplice, dove hai difficoltà?
mu è troppo breve

4
@muistooshort well default sort () ordina le stringhe in ordine alfabetico, stava cercando l'ordinamento string.length come si può vedere nella risposta scelta :)
jave.web

Risposte:


232

È possibile utilizzare il Array.sortmetodo per ordinare l'array. Una funzione di ordinamento che considera la lunghezza della stringa come criterio di ordinamento può essere utilizzata come segue:

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

Nota: ["a", "b", "c"]non è garantito che l' ordinamento in base alla lunghezza della stringa venga restituito ["a", "b", "c"]. Secondo le specifiche :

L'ordinamento non è necessariamente stabile (ovvero, gli elementi che si confrontano allo stesso modo non rimangono necessariamente nel loro ordine originale).

Se l'obiettivo è ordinare per lunghezza, allora per ordine del dizionario è necessario specificare criteri aggiuntivi:

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

Aggiungo che questo ordina l'array diminuendo la lunghezza degli elementi.
davidhq

aha è nel commento :) non l'ho visto all'inizio
davidhq

Solo per aggiungere un'informazione. Questo snippet non funzionerà per tutti i casi.
Arunkumar Srisailapathi

Prova per arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'], fallirà
Arunkumar Srisailapathi

15
The ES6 wayarr.sort((a, b) => b.length - a.length)
Fergal

4

Possiamo usare il metodo Array.sort per ordinare questo array.

Soluzione ES5

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

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

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

Per l' ordinamento crescente :a.length - b.length

Per l' ordinamento decrescente :b.length - a.length

Soluzione ES6

Attenzione: non tutti i browser possono comprendere il codice ES6!

In ES6 possiamo usare espressioni di funzione freccia .

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

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

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



0

Sulla base della risposta di Salman, ho scritto una piccola funzione per incapsularlo:

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

quindi chiamalo con

sortArrayByLength( myArray, true );

Si noti che sfortunatamente, le funzioni possono / non devono essere aggiunte al prototipo Array, come spiegato in questa pagina .

Inoltre, ha modificato l'array passato come parametro e non restituisce nulla. Ciò forzerebbe la duplicazione dell'array e non sarebbe ottimo per array di grandi dimensioni. Se qualcuno ha un'idea migliore, per favore commenta!


0

Ho adattato la risposta di @ shareef per renderla concisa. Io uso,

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


questo ordinerebbe da lunghezza bassa a lunghezza maggiore
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

1
Pubblicare il codice da solo non aiuta. Fornisci una breve descrizione di ciò che fa il tuo codice.
coderpc

-1

Questo codice dovrebbe fare il trucco:

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

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

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

-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>

La funzione anonima che passi per ordinare gli dice come ordinare l'array dato. Spero che questo aiuti. So che questo crea confusione, ma puoi dire alla funzione di ordinamento come ordinare gli elementi dell'array passandogli una funzione come parametro che dice cosa fare


5
Cosa dovrebbe restituire la funzione di confronto dell'ordinamento? Ecco un suggerimento: non è un booleano.
mu è troppo breve
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.