Справочник javascript: sort

Форум

Учебник Node.JS скринкаст Стандарт языка

Справочник

Discord чат

 
Статьи Тест знаний Аналоги функций PHP  

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



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

#permalink

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


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

#permalink

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


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

#permalink

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

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

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

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

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

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

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



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

#permalink

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


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

#permalink

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


Автор: 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]


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

#permalink

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



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

#permalink

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


Автор: Гость (не зарегистрирован), дата: 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:52

#permalink

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


 
Поиск по сайту
Содержание

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

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