it-swarm.com.ru

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

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

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

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

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

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

70
ramesh kumar

Вы можете использовать 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
});
175
Salman A

Вот сортировка, в зависимости от длины строки с javascript, как вы просили:

[решение задачи по пузырьковой сортировке] [1]

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

3
shareef

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

Для порядка сортировки ascending: a.length - b.length

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

Решение ES6

Внимание: не все браузеры могут понимать код ES6!

В ES6 мы можем использовать функциональные выражения arrow.

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

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

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

2
Bharata

Основываясь на ответе Салмана, я написал небольшую функцию для ее инкапсуляции: 

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

Обратите внимание, что, к сожалению, функции не могут/не должны добавляться в прототип Array, как объяснено на этой странице .

Кроме того, он изменил массив, переданный в качестве параметра, и ничего не возвращает. Это приведет к дублированию массива и не подойдет для больших массивов. Если у кого-то есть идея получше, пожалуйста, оставьте комментарий!

0
Nico

Я адаптировал ответ @ shareef, чтобы сделать его кратким. Я использую,

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

0
user3054109