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 на первое место)
все намного проще чем кажется.
Сортировка идет по алфавиту...Для цифровых значений принцип алфавитной сортировки.
Подскажите, пожалуйста, рациональный способ сортировки массива по длине его элементов. Пробовал стандартные функции, но результаты получаются неправильные.
var arr = [222,1,6666,33,"word",111111];
function lensort(a,b)
{
var s1 = "" + a; //будет полюбому строка
var s2 = "" + b;
if(s1.length < s2.lenght){return -1;} //сравнить длины
else if(s1.length > s2.length){return 1;}
return 0;
//или предыдущие три строки в одну:
//return (st1.length < st2.length) ? -1 : (st1.length > st2.length) ? 1 : 0;
};
alert( arr.sort(lensort) );
Кто-нибудь знает каким методом происходит сортировка? В спецификации вроде не сказанно.
по алфавиту
quickSort
Замечание будущим создателям нотаций (языков и т. д.).
Хотелось бы обратить внимание на следующее. К сожалению, метод 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 существуют замыкания, они и могут служить вашими параметрами без проблем.
Например:
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}
мой короче
Ну а как грамотно рассортировать, если есть "1. text1", "2.text2", "12.text3"... у меня теряется и сортирует "1. text1", "12.text3", "2.text2"... помогите нубу
по поводу замечаний сортировки, заметно, что Вы новичок в JS, Мне лично этот язык очень не нравился раньше, потом узнал получше, сейчас прям по душе)
Вообщем, меньше слов, больше дела, вот пример.
после запуска этого кода можно будет делать так:
результат выполнения:
fn(), this - это наш массив: [-10, 5, 6, 7, 10] , а в параметрах получаем наши параметры: [ это прекрасно работает ] и стандартные для метода sort( 5 6 )
fn(), this - это наш массив: [-10, 5, 6, 7, 10] , а в параметрах получаем наши параметры: [ это прекрасно работает ] и стандартные для метода sort( 6 7 )
fn(), this - это наш массив: [-10, 5, 6, 7, 10] , а в параметрах получаем наши параметры: [ это прекрасно работает ] и стандартные для метода sort( 7 10 )
fn(), this - это наш массив: [-10, 5, 6, 7, 10] , а в параметрах получаем наши параметры: [ это прекрасно работает ] и стандартные для метода sort( 10 -10 )
fn(), this - это наш массив: [-10, 5, 6, 7, 10] , а в параметрах получаем наши параметры: [ это прекрасно работает ] и стандартные для метода sort( 7 -10 )
fn(), this - это наш массив: [-10, 5, 6, 7, 10] , а в параметрах получаем наши параметры: [ это прекрасно работает ] и стандартные для метода sort( 6 -10 )
fn(), this - это наш массив: [-10, 5, 6, 7, 10] , а в параметрах получаем наши параметры: [ это прекрасно работает ] и стандартные для метода sort( 5 -10 )
результат [-10, 5, 6, 7, 10]
кстати, запускал в Гугл хроме, сначала не обратил внимание на объект this, в выводе консоли он сразу отсортирован, видимо это связанно с запоздалым рендерингом объектов и массивов в консоле.
"Автор: Valdemar_Rudolfovich (не зарегистрирован), дата: 21 августа, 2012 - 14:01 по поводу замечаний сортировки, заметно, что Вы новичок в JS"
Повторюсь ещё раз: считаю это недостатком исходного проектирования программного интерфейса данного объекта, в частности, недостатком проектирования сигнатуры метода sort.
Аргументы:
1. Что стоило заложить наличие параметра одного (по кр. мере) или более уже на стадии создания нотации? По моему мн., совсем ничего не стоило (т. е., это было бы оч. легко). А польза была бы очевидна. Возможно, это не поздно сделать и сейчас - для след. версий ECMAScript. При этом если метод вызывается без доп. параметров, то он мог бы вести себя так, как это реализовано в настоящем.
2. Не утверждаю, что невозможно имеющуюся ситуацию исправить (в частн., расширением интерфейса объекта введением доп. метода "sortEx"). Это можно, а также можно, вероятно, сделать и др. способами. Но (повторюсь ещё раз):
2.1. Считаю неправильным (концептуально неправильным) перекладывать эту задачу (кот. явл., по существу, применением "заплаток") на прикладных программистов.
2.2. Такое ("заплаточное") расширение интерфейса - это плохо. Если попытаться заглянуть в последствие этого - происходит перемножение на *10...00 применений 10...00-ми прикладными программистами - для решений их прикл. задач (каждый добавит по разл. рода *Ex, *Ex2, и т. д.). Голова - это не мусорное ведро, там прикл. программист вынужден держать много интерфейсов, объектов, методов, констант, глоб. идентификаторов и пр. разных нотаций / разных языков.
3. Данное замечание адресовано создателям будущих нотаций / лицам, проектирущим интерфейсы. Причина данного замечания - то, что подобный недостаток уже встречал в др. языках. Цель данного замечания (повторяюсь): предотвратить появление указанного недостатка (т. е., недостатка сигнатуры метода упорядочивания структ. данных ~списку) в др. нотациях (языках, библиотечных расширениях языков и т. п.). По моему мн., создатели ПО, предназначенного для повторного использования (и его интерфейсов), по хорошему, должны помнить, что создаваемое ими будет использоваться в *10...00 прикл. задач и прочитывать последствия.
1. Сорри за оффтоп, но вам не кажется, что у вас слишком много "своего" мнения? Создатели языков не такие уж и глупые люди.
2. Продираясь через ваш кошмарный код, приведенный в одном из ваших комментариев, и переформатировав его так, чтобы стало понятнее, я пришел к выводу, что предложенное вами решение ничуть не отличается от решения с замыканием, предложенное пользователем boomyjee (смотрите свой код и ваши замечания), просто оно засунуто в еще одну функцию и от этого ДЕЙСТВИТЕЛЬНО может потеряться гибкость.
3. По поводу вашего контрзамечания о том, что использование замыканий - это плохо, позвольте мне ответить вот таким вот кусочком кода:
Пояснение: функция createSorter - это абстрактная фабрика методов сортировки. Подходяще? Не надо помнить о каких то там внешних переменных, достаточно знать, какие методы сравнения можно создавать при помощи createSorter. Новый способ сортировки? Пожалуйста, просто добавляем еще что-то в createSorter, просто дополняем код в одном месте. Хотите что-то совсем безумное? Научите createSorter принимать вашу функцию и он ее как то будет использовать.
В итоге все решается функциями, а не дополнительными костылями, о которых вы развели целую дискуссию
"createSorter - это абстрактная фабрика методов сортировки. Подходяще?" Нет, не подходяще. Человек - дилетант.
А можете обосновать свое мнение, почему это не является подходящим?
Конечно, могу. По кр. мере, могу изложить аргументы. (Иначе бы не говорил так).
Но во 1-ых, если это и сделаю, то не сейчас (сейчас занят, извините). Поэтому у Вас шанс - пока есть время, попробуйте сами найти ответ на св. вопрос.
Во 2-ых (ЭТО - ГЛАВНОЕ), здесь - не то место, чтобы обсуждать то, что не связано с темой (Array.Sort). И так уже, некоторые недовольны, обсуждением высказанной мысли и, в т. числе длинными мотивациями.
См. выше: Для остальных вопросов и обсуждений есть форум.
точнее, см. ниже (а не выше)
П.С. Или же (если не хотите ждать) найдите специалиста (или человека разбирающегося в паттерном программировании хотя бы на 4 из 5) и попросите его - он Вам объяснит.
Владимир, вы пишете бред, в основном потому, что не понимаете сути замыканий и функционального программирования. Не надо сводить язык к ООП, оно не всегда к добру. Предложенный вами дизайн плох, избыточен и далеко не так универсален как вы думаете.
Поэтому прежде чем предлагать свой дизайн, найдите специалиста (или человека разбирающегося в функциональном программировании хотя бы на 4 из 5) и попросите его — он вам объяснит почему ваша идея плоха.
Суть проблемы - описанный выше недостаток нотации, в частн., метода sort.
Описание здесь проблемы адресовано создателям будущих нотаций и/или ПО, целенаправленно предназначенного для массового повторного использования (библиотек, и т. п.). Цель обращения на неё внимания здесь - это предотвратить появления подобных изъянов в новых нотациях и/или ПО указанных классов.
Владимир!
1. Вы знаете что такое замыкание и как его едят? Если не знаете, то пожалуйста, разберитесь в этом, и вы поймете, что к чему. На худой конец, возьмите книжку SICP - Структура и Интепретация Компьютерных Программ (авторы Харольд Абельсон и Джей Сассман). В ней все очень хорошо расписано. И в ней вы найдете объяснение тому, что метод .sort, принимающий в себя всего одну функцию сортировки - полноценен и достаточен, ему не нужны никакие другие параметры, кроме этой функции, которая сама в себе содержит уже какие то связанные параметры, необходиме для сортировки, и эти параметры скрыты и недоступны, что обеспечивает безопасность. (Кстати говоря, JavaScript - это Scheme, Lisp в шкуре C, как говорит Дуглас Крокфорд, один из специалистов по JS, поэтому я вам так настоятельно рекомендую почитать SICP).
2. Ваша отсылка к специалисту, знающему паттерны программирования и проектирования - слаба и недоказательна, поскольку конкретный вид и реализация паттернов программирования и проектирования сильно зависят от используемых парадигм, хотя в целом паттерны являются мощным эвристическим инструментом, помогающим находить некоторые решения на базе уже хорошо опробованных методик (а также это инструмент поиска новых паттернов). Ваше же понимание паттернов, по всей видимости, основывается на конкретной реализации в конкретно взятом языке программирования (сильно подозреваю, что Java или плохо изученный С++).
P.S. Прошу прощения у всех модераторов ресурса, но войну я здесь развел из за желания вывести хотя бы часть истины, чтобы человек, который впервые знакомится с языком, и читающий эти комментарии, не впадал в подобные ошибки, подобные ошибкам Владимира.
P.P.S. 2Владмир. И кстати, ваша занятость - также недоказательна. Находите же вы время заходить на эту страницу и периодически что то отписываться, при этом вам лень из за вашей же занятости доказывать свои слова. Мне кажется, что я свое доказал. Приведете вы свои доказательства?
И да, кстати, ваше упорное адресование ваших сомнений создателям новых нотаций (и там дальше бла бла бла какое то) вас абсолютно не красит. Здесь вы общаетесь с программистами на js и пользователями js, среди них вряд ли кто то является создателем нового языка. Да и вряд ли они будут прислушиваться к вашему мнению.
Не могу въехать в сортировку массива. Читал информацию на других сайтах - не помогло.
Допустим есть массив:
и сортировочная функция:
Я упорно не понимаю, откуда в функцию подставляются a и b - это значения из массива array?
да. значения из массива перебираются определенным (зависящим от реализации, насколько я знаю) способом и передаются функции для сравнения, а результат используется для сортировки.
Для сортировки в каком-либо ином порядке, отличном от алфавитного, методу
sort() можно передать функцию сравнения в качестве аргумента. Эта функция
устанавливает, какой из двух ее аргументов a или b должен следовать раньше в
отсортированном списке. Если первый a аргумент должен предшествовать второму b, функция сравнения должна возвращать отрицательное число. Если первый аргумент должен следовать за вторым в отсортированном массиве, то функция должна возвращать число больше нуля. А если два значения эквивалентны (т. е. порядок их следования не важен), функция сравнения должна возвращать 0.
что же касается замыканий и пр. — а как вы думаете, почему в C++ сейчас активно используются функторы (объекты с оператором вызова) вместо функций? по сути это ведь те же замыкания. особенно в C++11, где для них есть специальный синтаксис. и, конечно, они могут иметь доступ к локальным переменным.
и в JS замыкания хороши именно тем, что они имеют доступ к локальным, а не только к глобальным, переменным. а раз переменные локальны, то коллизия имен крайне маловероятна (если длина функции не 1000+ строк, конечно)
Olx anonse erotyczne
Roksa bdsm krakow
Olx filmy erotyczne
Roksa psie pole
Roksa biała
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.