Як сортувати масив, виходячи з довжини кожного елемента?


95

У мене такий масив:

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

Після сортування вихідним масивом має бути:

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

Я маю на увазі, я хочу в порядку зменшення довжини кожного елемента.


1
sortдосить прямо вперед, де у вас виникають труднощі?
му занадто короткий

4
@muistooshort ну за замовчуванням sort () сортує рядки за алфавітом, він шукав сортування string.length, як це видно у вибраній відповіді :)
jave.web

Відповіді:


231

Ви можете використовувати Array.sortметод для сортування масиву. Функцію сортування, яка розглядає довжину рядка як критерій сортування, можна використовувати наступним чином:

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

Примітка: сортування ["a", "b", "c"]за довжиною рядка не гарантує повернення ["a", "b", "c"]. Відповідно до специфікацій :

Сортування не обов'язково стабільне (тобто елементи, що порівнюють рівні, не обов'язково залишаються у своєму початковому порядку).

Якщо метою є сортування за довжиною, то за порядком словника потрібно вказати додаткові критерії:

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

Я б додав, що це сортує масив, зменшуючи довжину елементів.
davidhq

ага, це в коментарі :) спочатку не бачив
davidhq

Просто для додання інформації. Цей фрагмент не працюватиме у всіх випадках.
Arunkumar Srisailapathi

Спробуйте для arr = ['a', 'b', 'c', 'd', 'e', ​​'f', 'g', 'h', 'i', 'k', 'l'], це не вдасться
Арункумар Шрісайлапаті

15
Шлях ES6arr.sort((a, b) => b.length - a.length)
Фергал

4

Для сортування цього масиву ми можемо використовувати метод Array.sort .

Розчин ES5

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

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

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

Для порядку сортування за зростанням :a.length - b.length

Для зменшення порядку сортування:b.length - a.length

Рішення ES6

Увага: не всі браузери можуть зрозуміти код ES6!

У ES6 ми можемо використовувати вирази функції стрілки .

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

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

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



0

На основі відповіді Салмана я написав невелику функцію для її інкапсуляції:

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

тоді просто зателефонуйте йому за допомогою

sortArrayByLength( myArray, true );

Зауважте, що, на жаль, до прототипу масиву не можна додавати функції, як це пояснено на цій сторінці .

Крім того, він змінив масив, що передається як параметр, і нічого не повертає. Це призведе до дублювання масиву і не буде чудовим для великих масивів. Якщо хтось має кращу ідею, будь ласка, прокоментуйте!


0

Я адаптував відповідь @ shareef, щоб зробити її стислою. Я використовую,

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


це відсортується від малої довжини до більшої довжини
Мігель

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
Опублікування коду самостійно не допоможе. Дайте коротку характеристику того, що робить ваш код.
coderpc

-1

Цей код повинен зробити трюк:

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>

Анонімна функція, яку ви передаєте для сортування, повідомляє, як сортувати даний масив. Сподіваюся, це допомагає. Я знаю, що це бентежить, але ви можете сказати функції сортування, як сортувати елементи масиву, передаючи їй функцію як параметр, що повідомляє це що робити


5
Що має повернути функція порівняння сортування? Ось підказка: це не логічне значення.
му занадто коротке ,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.