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 - 23: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 - 11:46
#permalink

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


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

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


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

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


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

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


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

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

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

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

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

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

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

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


Автор: Гость - Владимир (не зарегистрирован), дата: 6 июня, 2011 - 21: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 - 01:39
#permalink

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

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

Автор: Гость (не зарегистрирован), дата: 5 августа, 2011 - 01: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 - 23:45
#permalink

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


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

мой короче

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

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

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
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
Антиспам
2 + 2 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Реклама

Содержание

Учебник javascript

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

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

Интерфейсы

Все об AJAX

Оптимизация

Разное

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

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