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.


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

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



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!


0

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

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


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

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

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

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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.