Wie sortiere ich ein Array nach der Länge jedes Elements?

95

Ich habe ein Array wie dieses:

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

Nach dem Sortieren sollte das Ausgabearray wie folgt lauten:

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

Ich meine, ich möchte in absteigender Reihenfolge die Länge jedes Elements.

Ramesh Kumar
quelle
1
sortist ziemlich einfach, wo hast du Schwierigkeiten?
Mu ist zu kurz
4
@ Muistooshort gut Standard sort () sortiert Strings alphabetisch, er suchte nach der string.length Sortierung, wie in der gewählten Antwort zu sehen ist :)
jave.web

Antworten:

231

Sie können Array.sortdas Array mithilfe der Methode sortieren. Eine Sortierfunktion, die die Länge der Zeichenfolge als Sortierkriterium berücksichtigt, kann wie folgt verwendet werden:

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

Hinweis: Es ["a", "b", "c"]wird nicht garantiert, dass die Sortierung nach Länge der Zeichenfolge zurückgegeben wird ["a", "b", "c"]. Gemäß den Spezifikationen :

Die Sortierung ist nicht unbedingt stabil (dh Elemente, die gleich sind, bleiben nicht unbedingt in ihrer ursprünglichen Reihenfolge).

Wenn das Ziel darin besteht, nach Länge zu sortieren, müssen Sie nach Wörterbuchreihenfolge zusätzliche Kriterien angeben:

["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.
quelle
Ich würde hinzufügen, dass dies das Array sortiert, indem die Länge der Elemente verringert wird.
Davidhq
aha es ist im Kommentar :) habe es zuerst nicht gesehen
davidhq
Nur um eine Information hinzuzufügen. Dieses Snippet funktioniert nicht in allen Fällen.
Arunkumar Srisailapathi
Versuchen Sie es mit arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'], es wird scheitern
Arunkumar Srisailapathi
15
Der ES6 Wegarr.sort((a, b) => b.length - a.length)
Fergal
4

Wir können die Array.sort- Methode verwenden, um dieses Array zu sortieren.

ES5-Lösung

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

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

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

Bei aufsteigender Sortierreihenfolge:a.length - b.length

Für absteigende Sortierreihenfolge:b.length - a.length

ES6-Lösung

Achtung: Nicht alle Browser können ES6-Code verstehen!

In ES6 können wir eine verwenden Pfeil Funktion Ausdrücke .

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

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

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

Bharata
quelle
3

Hier ist die Sortierung, abhängig von der Länge eines Strings mit Javascript, wie Sie gefragt haben:

[die Lösung des Problems durch Blasensortierung] [1]

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

shareef
quelle
0

Basierend auf Salmans Antwort habe ich eine kleine Funktion geschrieben, um sie zu kapseln:

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

dann ruf es einfach mit an

sortArrayByLength( myArray, true );

Beachten Sie, dass dem Array-Prototyp leider keine Funktionen hinzugefügt werden können / sollten, wie auf dieser Seite erläutert .

Außerdem wurde das als Parameter übergebene Array geändert und es wird nichts zurückgegeben. Dies würde die Duplizierung des Arrays erzwingen und wäre für große Arrays nicht großartig. Wenn jemand eine bessere Idee hat, kommentieren Sie bitte!

Nico
quelle
0

Ich habe die Antwort von @ shareef angepasst, um sie kurz zu fassen. Ich benutze,

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


quelle
Dies würde von geringer Länge zu höherer Länge sortieren
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
quelle
1
Das Posten des Codes allein hilft nicht. Beschreiben Sie kurz, was Ihr Code tut.
Coderpc
-1

Dieser Code sollte den Trick machen:

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

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

console.log(JSON.stringify(array, null, '\t'));
Hiền
quelle
-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>

Die anonyme Funktion, die Sie zum Sortieren übergeben, gibt an, wie das angegebene Array sortiert werden soll. Ich hoffe, dies hilft. Ich weiß, dass dies verwirrend ist, aber Sie können der Sortierfunktion mitteilen, wie die Elemente des Arrays sortiert werden sollen, indem Sie ihr eine Funktion als Parameter übergeben es was zu tun

Verrückter Wissenschaftler
quelle
5
Was soll die Sortiervergleichsfunktion zurückgeben? Hier ist ein Hinweis: Es ist kein Boolescher Wert.
Mu ist zu kurz