Javascript.RU

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, это тот же сортированный массив

См. также


Автор: Num_Lk (не зарегистрирован), дата: 28 февраля, 2011 - 22:31
#permalink

Самый простой способ отсортировать числовой массив,это задать функциональный литерал:
var a=[15,7,100,50];
a.sort(function(a,b){return a-b;});
alert(a.join()); // Выведет 7,15,50,100


Автор: Гость (не зарегистрирован), дата: 11 марта, 2012 - 10:46
#permalink

По моему это самый лучший способ сортировки, так как array.sort работает не корректно, вместо 0,6,18,24,25, он сортирует 0,18,24,25,6, не могли бы Вы объяснить как работает этот функциональный литерал?


Автор: Гость (не зарегистрирован), дата: 10 мая, 2012 - 12:00
#permalink

функция сорт представляет что сортирует строковые элементы(у элемента "25" первый символ 2, он меньше чем 6, поэтому функция и ставит 25 на первое место)


Автор: Гость (не зарегистрирован), дата: 22 мая, 2014 - 07:12
#permalink

все намного проще чем кажется.
Сортировка идет по алфавиту...Для цифровых значений принцип алфавитной сортировки.


Автор: Гость (не зарегистрирован), дата: 8 марта, 2011 - 14:33
#permalink

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


Автор: Гость (не зарегистрирован), дата: 1 февраля, 2013 - 12:44
#permalink

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


Автор: Гость (не зарегистрирован), дата: 26 апреля, 2011 - 21:07
#permalink

Кто-нибудь знает каким методом происходит сортировка? В спецификации вроде не сказанно.


Автор: Гость (не зарегистрирован), дата: 22 мая, 2014 - 07:11
#permalink

по алфавиту


Автор: Гость (не зарегистрирован), дата: 14 января, 2017 - 13:59
#permalink

quickSort


Автор: Гость - Владимир (не зарегистрирован), дата: 6 июня, 2011 - 20:13
#permalink

Замечание будущим создателям нотаций (языков и т. д.).

Хотелось бы обратить внимание на следующее. К сожалению, метод sort в JS не допускает возможности передачи параметров функции для сравнения элементов. Т. е., при вызове функции, соответствующей аргументу sortFunction, метод sort не будет передавать ей никаких параметров. Это плохо и, по моему мнению, является недоработкой создателей JS.

Лучше было бы, если бы данный метод был бы спроектирован / реализован, например, как:

arrayObj.sort( [sortFunction, [theComparison_parameters] ] )

Т. е., добавить в сигнатуру метода один параметр: theComparison_parameters. Одного параметра достаточно, т. к., в него можно поместить всё, что угодно. Метод же sort при вызове функции sortFunction передаёт ей этот аргумент theComparison_parameters, т. е.:

sortFunction(..., ..., theComparison_parameters)

Пишу этот комментарий т. к. вижу этот недостаток уже не в первом языке программирования / ПО для повторного использования (библиотеке и т. п.). Т. е., у их создателей, видимо, убогое (упрощённое) представление о потребностях тех программистов, кто их повторноиспользуемое ПО будет использовать. Поэтому, граждане, кто собирается создавать нотации, языки, библиотеки и т. п. (возможно, кто-то из них данным сайтом пользуется), учитывайте вышесказанное. Тем более, это не так трудно.


Автор: Гость - Владимир (не зарегистрирован), дата: 6 июня, 2011 - 20:24
#permalink

Хотя описанная выше проблема не смертельна. Её можно разрешить в 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.


Автор: boomyjee (не зарегистрирован), дата: 8 июля, 2011 - 00:39
#permalink

Владимиру:
в JS существуют замыкания, они и могут служить вашими параметрами без проблем.
Например:

someParam = 'test';
arr.sort(function(a,b){
   if (someParam=='bla') {
      ...
   }
})

Автор: Гость (не зарегистрирован), дата: 5 августа, 2011 - 00:28
#permalink

1. Использование функции-замыкания (вложенной функции) для данной цели плохо. Т. к. нужно каждый раз для случая вызова метода "Array.prototype.sort" писать вложенную функцию вместо одной универсальной, параметризуемой. Следствия этого (п. 1):

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.


Автор: Marwell, дата: 23 июля, 2011 - 22:45
#permalink

самый короткий перемешиватель массива:
function sRand() {return Math.random() > 0.5 ? 1 : -1}


Автор: Гость (не зарегистрирован), дата: 22 апреля, 2012 - 20:14
#permalink

мой короче

function rand() {return Math.random() - 0.5}

Автор: Гость (не зарегистрирован), дата: 23 июля, 2012 - 18:50
#permalink

Ну а как грамотно рассортировать, если есть "1. text1", "2.text2", "12.text3"... у меня теряется и сортирует "1. text1", "12.text3", "2.text2"... помогите нубу


Автор: Дзен-трансгуманист, дата: 24 июля, 2012 - 00:02
#permalink
var arr = ["1. text1", "12.text3", "2.text2"];

arr.sort(function (a, b) {
  return parseInt(a, 10) - parseInt(b, 10);
});

alert(arr.join("\n"));

Автор: Valdemar_Rudolfovich (не зарегистрирован), дата: 21 августа, 2012 - 13:01
#permalink

по поводу замечаний сортировки, заметно, что Вы новичок в JS, Мне лично этот язык очень не нравился раньше, потом узнал получше, сейчас прям по душе)

Вообщем, меньше слов, больше дела, вот пример.

// Дополняем класс Array методом sortEx
Array.prototype.sortEx = function sortEx(fn /* , param1, param2, etc */) {
	var array = this, 
		args = Array.prototype.slice.call(arguments, 1);
	Array.prototype.sort.call(this, function (a, b) {
		return fn.apply(array, [a, b].concat(args));
	});
}

после запуска этого кода можно будет делать так:

var fn = function(item1, item2, param1, param2, param3) {
	console.log('fn(), this - это наш массив:', this, ', а в параметрах получаем наши параметры: [', param1, param2, param3, '] и стандартные для метода sort(', item1, item2, ')');
	return item1 - item2;
}

var test = [5, 6, 7, 10, -10];
test.sortEx(fn, 'это', 'прекрасно', 'работает', '!!!');
console.log('результат', test);

результат выполнения:

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]


Автор: rudolfovich, дата: 21 августа, 2012 - 13:10
#permalink

кстати, запускал в Гугл хроме, сначала не обратил внимание на объект this, в выводе консоли он сразу отсортирован, видимо это связанно с запоздалым рендерингом объектов и массивов в консоле.


Автор: Гость - Владимир (не зарегистрирован), дата: 27 июля, 2013 - 17:35
#permalink

"Автор: 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 прикл. задач и прочитывать последствия.


Автор: Гость (не зарегистрирован), дата: 12 ноября, 2013 - 09:50
#permalink

1. Сорри за оффтоп, но вам не кажется, что у вас слишком много "своего" мнения? Создатели языков не такие уж и глупые люди.

2. Продираясь через ваш кошмарный код, приведенный в одном из ваших комментариев, и переформатировав его так, чтобы стало понятнее, я пришел к выводу, что предложенное вами решение ничуть не отличается от решения с замыканием, предложенное пользователем boomyjee (смотрите свой код и ваши замечания), просто оно засунуто в еще одну функцию и от этого ДЕЙСТВИТЕЛЬНО может потеряться гибкость.

3. По поводу вашего контрзамечания о том, что использование замыканий - это плохо, позвольте мне ответить вот таким вот кусочком кода:

function createSorter(params) {
    return function(a, b) {
        return do_something(a, b, params); // как то сравниваем а и b, в зависимости от значения params и возвращаем результат.
    };
};

some_array.sort(createSorter(user_params));

Пояснение: функция createSorter - это абстрактная фабрика методов сортировки. Подходяще? Не надо помнить о каких то там внешних переменных, достаточно знать, какие методы сравнения можно создавать при помощи createSorter. Новый способ сортировки? Пожалуйста, просто добавляем еще что-то в createSorter, просто дополняем код в одном месте. Хотите что-то совсем безумное? Научите createSorter принимать вашу функцию и он ее как то будет использовать.
В итоге все решается функциями, а не дополнительными костылями, о которых вы развели целую дискуссию


Автор: Гость (не зарегистрирован), дата: 14 декабря, 2013 - 07:49
#permalink

"createSorter - это абстрактная фабрика методов сортировки. Подходяще?" Нет, не подходяще. Человек - дилетант.


Автор: Гость (не зарегистрирован), дата: 21 декабря, 2013 - 00:45
#permalink

А можете обосновать свое мнение, почему это не является подходящим?


Автор: Гость (не зарегистрирован), дата: 1 января, 2014 - 01:53
#permalink

Конечно, могу. По кр. мере, могу изложить аргументы. (Иначе бы не говорил так).

Но во 1-ых, если это и сделаю, то не сейчас (сейчас занят, извините). Поэтому у Вас шанс - пока есть время, попробуйте сами найти ответ на св. вопрос.

Во 2-ых (ЭТО - ГЛАВНОЕ), здесь - не то место, чтобы обсуждать то, что не связано с темой (Array.Sort). И так уже, некоторые недовольны, обсуждением высказанной мысли и, в т. числе длинными мотивациями.

См. выше: Для остальных вопросов и обсуждений есть форум.


Автор: Гость (не зарегистрирован), дата: 1 января, 2014 - 01:55
#permalink

точнее, см. ниже (а не выше)


Автор: Гость (не зарегистрирован), дата: 1 января, 2014 - 01:57
#permalink

П.С. Или же (если не хотите ждать) найдите специалиста (или человека разбирающегося в паттерном программировании хотя бы на 4 из 5) и попросите его - он Вам объяснит.


Автор: Remper (не зарегистрирован), дата: 14 января, 2014 - 05:37
#permalink

Владимир, вы пишете бред, в основном потому, что не понимаете сути замыканий и функционального программирования. Не надо сводить язык к ООП, оно не всегда к добру. Предложенный вами дизайн плох, избыточен и далеко не так универсален как вы думаете.
Поэтому прежде чем предлагать свой дизайн, найдите специалиста (или человека разбирающегося в функциональном программировании хотя бы на 4 из 5) и попросите его — он вам объяснит почему ваша идея плоха.


Автор: Гость (не зарегистрирован), дата: 17 января, 2014 - 10:29
#permalink

Суть проблемы - описанный выше недостаток нотации, в частн., метода sort.

Описание здесь проблемы адресовано создателям будущих нотаций и/или ПО, целенаправленно предназначенного для массового повторного использования (библиотек, и т. п.). Цель обращения на неё внимания здесь - это предотвратить появления подобных изъянов в новых нотациях и/или ПО указанных классов.


Автор: Гость (не зарегистрирован), дата: 27 января, 2014 - 13:05
#permalink

Владимир!
1. Вы знаете что такое замыкание и как его едят? Если не знаете, то пожалуйста, разберитесь в этом, и вы поймете, что к чему. На худой конец, возьмите книжку SICP - Структура и Интепретация Компьютерных Программ (авторы Харольд Абельсон и Джей Сассман). В ней все очень хорошо расписано. И в ней вы найдете объяснение тому, что метод .sort, принимающий в себя всего одну функцию сортировки - полноценен и достаточен, ему не нужны никакие другие параметры, кроме этой функции, которая сама в себе содержит уже какие то связанные параметры, необходиме для сортировки, и эти параметры скрыты и недоступны, что обеспечивает безопасность. (Кстати говоря, JavaScript - это Scheme, Lisp в шкуре C, как говорит Дуглас Крокфорд, один из специалистов по JS, поэтому я вам так настоятельно рекомендую почитать SICP).

2. Ваша отсылка к специалисту, знающему паттерны программирования и проектирования - слаба и недоказательна, поскольку конкретный вид и реализация паттернов программирования и проектирования сильно зависят от используемых парадигм, хотя в целом паттерны являются мощным эвристическим инструментом, помогающим находить некоторые решения на базе уже хорошо опробованных методик (а также это инструмент поиска новых паттернов). Ваше же понимание паттернов, по всей видимости, основывается на конкретной реализации в конкретно взятом языке программирования (сильно подозреваю, что Java или плохо изученный С++).

P.S. Прошу прощения у всех модераторов ресурса, но войну я здесь развел из за желания вывести хотя бы часть истины, чтобы человек, который впервые знакомится с языком, и читающий эти комментарии, не впадал в подобные ошибки, подобные ошибкам Владимира.

P.P.S. 2Владмир. И кстати, ваша занятость - также недоказательна. Находите же вы время заходить на эту страницу и периодически что то отписываться, при этом вам лень из за вашей же занятости доказывать свои слова. Мне кажется, что я свое доказал. Приведете вы свои доказательства?


Автор: Гость (тот же самый, что и в предыдущих комментах) (не зарегистрирован), дата: 27 января, 2014 - 13:34
#permalink

И да, кстати, ваше упорное адресование ваших сомнений создателям новых нотаций (и там дальше бла бла бла какое то) вас абсолютно не красит. Здесь вы общаетесь с программистами на js и пользователями js, среди них вряд ли кто то является создателем нового языка. Да и вряд ли они будут прислушиваться к вашему мнению.


Автор: Гость (не зарегистрирован), дата: 20 июня, 2014 - 15:47
#permalink

Не могу въехать в сортировку массива. Читал информацию на других сайтах - не помогло.
Допустим есть массив:

var myarray=[99, 90, 5,100];

и сортировочная функция:

myarray.sort(function(a,b){return b - a})

Я упорно не понимаю, откуда в функцию подставляются a и b - это значения из массива array?


Автор: Виталий (nZ) (не зарегистрирован), дата: 9 августа, 2014 - 22:51
#permalink

myarray.sort(function(a,b){return b - a})
Я упорно не понимаю, откуда в функцию подставляются a и b - это значения из массива array?

да. значения из массива перебираются определенным (зависящим от реализации, насколько я знаю) способом и передаются функции для сравнения, а результат используется для сортировки.


Автор: Гость (не зарегистрирован), дата: 27 августа, 2015 - 03:39
#permalink

Для сортировки в каком-либо ином порядке, отличном от алфавитного, методу
sort() можно передать функцию сравнения в качестве аргумента. Эта функция
устанавливает, какой из двух ее аргументов a или b должен следовать раньше в
отсортированном списке. Если первый a аргумент должен предшествовать второму b, функция сравнения должна возвращать отрицательное число. Если первый аргумент должен следовать за вторым в отсортированном массиве, то функция должна возвращать число больше нуля. А если два значения эквивалентны (т. е. порядок их следования не важен), функция сравнения должна возвращать 0.


Автор: Виталий (nZ) (не зарегистрирован), дата: 9 августа, 2014 - 22:52
#permalink

что же касается замыканий и пр. — а как вы думаете, почему в C++ сейчас активно используются функторы (объекты с оператором вызова) вместо функций? по сути это ведь те же замыкания. особенно в C++11, где для них есть специальный синтаксис. и, конечно, они могут иметь доступ к локальным переменным.
и в JS замыкания хороши именно тем, что они имеют доступ к локальным, а не только к глобальным, переменным. а раз переменные локальны, то коллизия имен крайне маловероятна (если длина функции не 1000+ строк, конечно)


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
13 + 3 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum