Jak posortować tablicę na podstawie długości każdego elementu?

99

Mam taką tablicę:

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

Po posortowaniu tablica wyjściowa powinna wyglądać następująco:

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

Mam na myśli, chcę w porządku malejącym długości każdego elementu.

ramesh kumar
źródło
1
sortjest dość prosta, gdzie masz trudności?
mu jest za krótkie
5
@muistooshort well default sort () sortuje ciągi alfabetycznie, szukał sortowania string.length, jak widać w wybranej odpowiedzi :)
jave.web

Odpowiedzi:

238

Możesz użyć Array.sortmetody do sortowania tablicy. Funkcja sortowania, która traktuje długość ciągu jako kryterium sortowania, może być używana w następujący sposób:

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

Uwaga: sortowanie ["a", "b", "c"]według długości łańcucha nie gwarantuje zwrotu ["a", "b", "c"]. Zgodnie ze specyfikacją :

Sortowanie niekoniecznie jest stabilne (to znaczy elementy, które porównują równe sobie, niekoniecznie pozostają w pierwotnej kolejności).

Jeśli celem jest sortowanie według długości, to według kolejności słownikowej należy określić dodatkowe kryteria:

["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
źródło
Dodałbym, że to sortuje tablicę poprzez zmniejszenie długości elementów.
davidhq
aha, to w komentarzu :) na początku tego nie widziałem
davidhq
Wystarczy dodać informację. Ten fragment kodu nie będzie działał we wszystkich przypadkach.
Arunkumar Srisailapathi,
Spróbuj dla arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'], to się nie powiedzie
Arunkumar Srisailapathi
16
Droga ES6arr.sort((a, b) => b.length - a.length)
Fergal
5

Do sortowania tej tablicy możemy użyć metody Array.sort .

Rozwiązanie ES5

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

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

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

W przypadku sortowania rosnącego :a.length - b.length

Dla porządku malejącego :b.length - a.length

Rozwiązanie ES6

Uwaga: nie wszystkie przeglądarki mogą zrozumieć kod ES6!

W ES6 możemy użyć wyrażeń funkcyjnych strzałek .

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

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

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

Bharata
źródło
0

Opierając się na odpowiedzi Salmana, napisałem małą funkcję, aby ją zamknąć:

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

potem po prostu zadzwoń

sortArrayByLength( myArray, true );

Zauważ, że niestety funkcje nie mogą / nie powinny być dodawane do prototypu Array, jak wyjaśniono na tej stronie .

Ponadto zmodyfikował tablicę przekazaną jako parametr i nic nie zwraca. Wymusiłoby to powielenie tablicy i nie byłoby świetne w przypadku dużych tablic. Jeśli ktoś ma lepszy pomysł, proszę o komentarz!

Nico
źródło
0

Dostosowałem odpowiedź @ shareef, aby była zwięzła. Używam,

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


źródło
to posortowałoby od małej do większej długości
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
źródło
1
Samo wysłanie kodu nie pomoże. Podaj krótki opis tego, co robi Twój kod.
coderpc
0

Jeśli chcesz zachować kolejność elementów o takiej samej długości jak oryginalna tablica, użyj sortowania bąbelkowego.

Input = ["ab","cdc","abcd","de"];

Output  = ["ab","cd","cdc","abcd"]

Funkcjonować:

function bubbleSort(strArray){
  const arrayLength = Object.keys(strArray).length;
    var swapp;
    var newLen = arrayLength-1;
    var sortedStrArrByLenght=strArray;
    do {
        swapp = false;
        for (var i=0; i < newLen; i++)
        {
            if (sortedStrArrByLenght[i].length > sortedStrArrByLenght[i+1].length)
            {
               var temp = sortedStrArrByLenght[i];
               sortedStrArrByLenght[i] = sortedStrArrByLenght[i+1];
               sortedStrArrByLenght[i+1] = temp;
               swapp = true;
            }
        }
        newLen--;
    } while (swap);
  return sortedStrArrByLenght;
}
Użytkownik123456
źródło
-1

Ten kod powinien załatwić sprawę:

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

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

console.log(JSON.stringify(array, null, '\t'));
Cześć
źródło
-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>

Funkcja anonimowa, którą przekazujesz do sortowania, mówi mu, jak posortować podaną tablicę. Mam nadzieję, że to pomoże Wiem, że jest to mylące, ale możesz powiedzieć funkcji sortowania, jak sortować elementy tablicy, przekazując jej funkcję jako parametr informujący co robić

Szalony naukowiec
źródło
5
Jaka jest funkcja porównania sortowania, która ma zwrócić? Oto wskazówka: to nie jest wartość logiczna.
mu jest za krótkie