sort
Синтаксис
arrayObj.sort( [sortFunction] )
Аргументы
-
sortFunction
-
Необязательный параметр - функция сортировки.
- Если указана функция, то элементы массива будут отсортированы согласно значениям, возвращаемых функцией. Условия на функцию можно записать следующим образом:
function sortFunction(a, b){
if(a меньше, чем b по некоторому критерию)
return -1 // Или любое число, меньшее нуля
if(a больше, чем b по некоторому критерию)
return 1 // Или любое число, большее нуля
// в случае а = b вернуть 0
return 0
}
- Если параметр не указан, массив будет отсортирован в лексикографическом порядке (возрастающий порядок следования символов в таблице ASCII).
Описание, примеры
Данный метод изменяет исходный массив. Получившийся массив также возвращается в качестве результата.
arr = [1,-1, 0]
a = arr.sort()
// => arr = [ -1, 0, 1 ]
alert(a === arr) // => true, это тот же сортированный массив
|
Самый простой способ отсортировать числовой массив,это задать функциональный литерал:
var a=[15,7,100,50];
a.sort(function(a,b){return a-b;});
alert(a.join()); // Выведет 7,15,50,100
По моему это самый лучший способ сортировки, так как array.sort работает не корректно, вместо 0,6,18,24,25, он сортирует 0,18,24,25,6, не могли бы Вы объяснить как работает этот функциональный литерал?
функция сорт представляет что сортирует строковые элементы(у элемента "25" первый символ 2, он меньше чем 6, поэтому функция и ставит 25 на первое место)
Подскажите, пожалуйста, рациональный способ сортировки массива по длине его элементов. Пробовал стандартные функции, но результаты получаются неправильные.
Кто-нибудь знает каким методом происходит сортировка? В спецификации вроде не сказанно.
Замечание будущим создателям нотаций (языков и т. д.).
Хотелось бы обратить внимание на следующее. К сожалению, метод sort в JS не допускает возможности передачи параметров функции для сравнения элементов. Т. е., при вызове функции, соответствующей аргументу sortFunction, метод sort не будет передавать ей никаких параметров. Это плохо и, по моему мнению, является недоработкой создателей JS.
Лучше было бы, если бы данный метод был бы спроектирован / реализован, например, как:
arrayObj.sort( [sortFunction, [theComparison_parameters] ] )
Т. е., добавить в сигнатуру метода один параметр: theComparison_parameters. Одного параметра достаточно, т. к., в него можно поместить всё, что угодно. Метод же sort при вызове функции sortFunction передаёт ей этот аргумент theComparison_parameters, т. е.:
sortFunction(..., ..., theComparison_parameters)
Пишу этот комментарий т. к. вижу этот недостаток уже не в первом языке программирования / ПО для повторного использования (библиотеке и т. п.). Т. е., у их создателей, видимо, убогое (упрощённое) представление о потребностях тех программистов, кто их повторноиспользуемое ПО будет использовать. Поэтому, граждане, кто собирается создавать нотации, языки, библиотеки и т. п. (возможно, кто-то из них данным сайтом пользуется), учитывайте вышесказанное. Тем более, это не так трудно.
Хотя описанная выше проблема не смертельна. Её можно разрешить в JS, например, следующим способом: вместо метода sort вызывать, например, такую функцию (Array__Sort):
function Array__Sort (
anArray,
aComparison_subroutine,
theParameters)
{
function As__JS__Array__Items__Comparison_subroutine(anItem, anotherItem)
{
var Result
Result=aComparison_subroutine(
anItem,
anotherItem,
theParameters);
return Result
} // As__JS__Array__Items__Comparison_subroutine
var Result
Result=(anArray instanceof Array);
if (Result && (anArray.length>0))
anArray.sort(As__JS__Array__Items__Comparison_subroutine);
return Result
} // function Array__Sort
В качестве аргумента вышеописанной функции Array__Sort должна передаваться функция такого вида:
function Comparison_subroutine (
anArray_element_to_be_compared,
anotherArray_element_to_be_compared,
theParameters)
{
...
} // Comparison_subroutine
Но, вообще, это уже извращение, которое навязывает язык. По-нормальному было бы, если бы решение данной проблемы было заложено уже в самой нотации языка JS.
__________
Новичок в JS.
Владимиру:
в JS существуют замыкания, они и могут служить вашими параметрами без проблем.
Например:
someParam = 'test'; arr.sort(function(a,b){ if (someParam=='bla') { ... } })1.1. (Следствие 1 п. 1). При наличии в предметной области необходимости упорядочивать массив многими способами (т. е., в разном порядке следования элементов) возможно появление многих не очень отличающихся друг от друга частей исходного текста ПО. Т. е., будет иметь место дублирование (или почти дублирование). Следствия этого (п. 1.1):
1.1.1. (Следствие 1 п. 1.1). При обнаружении ошибки её надо будет исправить во многих местах, а не в одном (как было в случае одной одной универсальной функции). Это - плохо.
1.1.2. (Следствие 2 п. 1.1). Такое дублирование увеличивает объём исходного текста ПО. Это - плохо.
2. Использование переменной, глобальной относительно функции сравнения элементов, для данной цели может быть плохо. Следствия этого (п. 2):
2.1. (Следствие 1 п. 2). Функция сравнения элементов должна "знать" о некоторой глобальной переменной. Следствия этого (п. 2.1):
2.1.1. (Следствие 1 п. 2.1). Это требует от программиста-создателя функции сравнения дополнительных знаний: знаний о переменной, её имени, типе, т. п. Это - плохо. И так в современных средах много разных концепций, соглашений, структур, имён (идентификаторов), и т. п., которые надо знать и держать в голове. Голова человека всё-таки не мусорное ведро.
2.1.2. (Следствие 2 п. 2.1). При наличии необходимости наличия не одного, а большого количества параметров, это потребует наличия определения многих переменных. Следствия этого (п. 2.1.2):
2.1.2.1 (Следствие 1 п. 2.1.2). Такое определение переменных увеличивает объём исходного текста ПО. Это - плохо.
2.1.2.2 (Следствие 2 п. 2.1.2). В том случае, когда к программе (документу) присоединяются несколько разных сценариев (например, определённых в разных файлах .JS, созданных разными авторами), возможны коллизии, т. е., совпадения имён переменных. Изменения значений таких переменных могут иметь непредсказуемые последствия. Это - плохо.
2.2. (Следствие 2 п. 2). Невозможно (в общем случае) использовать корректно глобальные переменные при наличии необходимости использования асинхронной обработки (когда одновременно, т. е., параллельно, упорядочиваются несколько разных массивов; а набор переменных - один). Это - плохо.
Всё сказанное здесь выше - вопрос стиля программирования.
Поэтому, повторяю ещё раз тем, кто собирается создавать нотации, языки, библиотеки и т. п.: то, что метод сортировки объекта-массива в не допускает возможности передачи параметров функции для сравнения элементов - плохо. По-нормальному было бы, если бы решение данной проблемы было заложено уже в самой нотации.
__________
Новичок в JS.
самый короткий перемешиватель массива:
function sRand() {return Math.random() > 0.5 ? 1 : -1}
мой короче
function rand() {return Math.random() - 0.5}Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.