Как отсортировать массив по длине каждого элемента?


100

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

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

После сортировки выходной массив должен быть:

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

Я имею в виду, что я хочу в порядке убывания длины каждого элемента.


1
sortдовольно прямолинейно, где у вас проблемы?
mu слишком короткое

5
@muistooshort ну default sort () сортирует строки по алфавиту, он искал сортировку string.length, как видно из выбранного ответа :)
jave.web 07

Ответы:


239

Вы можете использовать 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'], он потерпит неудачу
Arunkumar Srisailapathi

16
Путь ES6arr.sort((a, b) => b.length - a.length)
Фергал

5

Мы можем использовать 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

0

Если вы хотите сохранить порядок элементов той же длины, что и исходный массив, используйте пузырьковую сортировку.

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

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

Функция:

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

Этот код должен помочь:

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>

Анонимная функция, которую вы передаете для sort, сообщает ей, как сортировать данный массив. Надеюсь, это поможет. Я знаю, что это сбивает с толку, но вы можете указать функции сортировки, как сортировать элементы массива, передав ей функцию в качестве параметра, сообщающего это что делать


5
Что должна возвращать функция сравнения сортировки? Подсказка: это не логическое значение.
mu слишком короткий
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.