Sort
Сортирует элементы массива.
Метод из
Реализован в
JavaScript 1.2: модифицировано поведение.
Версия ECMA
Синтаксис
sort(compareFunction)
Параметры
compareFunction |
Специфицирует функцию, которая определяет порядок сортировки. Если опущен, массив сортируется лексикографически (в словарном порядке) в соответствии с конверсией в строку каждого элемента.
Описание
Если compareFunction
не предоставляется, элементы сортируются путём конвертирования их в строки и сравнения строк в лексикографическом порядке ("словарь" или "телефонная книга," не числовой порядок). Например, "80" встанет перед "9" в лексикографическом порядке, но при числовой сортировке 9 встанет перед 80.
Если compareFunction
предоставляется, массив элементов сортируется в соответствии с return-значением функции сравнения. Если a и b это два сравниваемых элемента, тогда:
Итак, функция compare имеет следующую форму:
function compare(a, b) {
if (a меньше, чем b, по некоторому критерию сортировки)
return -1
if (a больше, чем b, по некоторому критерию сортировки)
return 1
// a обязано быть равно b
return 0
}
Чтобы сравнить числа вместо строк, функция compare может просто вычесть b из a:
function compareNumbers(a, b) {
return a - b
}
JavaScript использует стабильную сортировку: индекс взаимного расположения a и b не изменяется, если a и b равны. Если индекс a меньше, чем индекс b перед началом сортировки, он останется таким и после сортировки, независимо от того, как переместятся a и b после сортировки.
Поведение метода sort
отличается в JavaScript 1.1 и в JavaScript 1.2.
В JavaScript 1.1, на некоторых платформах, метод sort не работает. Этот метод работает на всех платформах в JavaScript 1.2.
В JavaScript 1.2, этот метод больше не конвертирует undefined-элементы в null; вместо этого он сортирует их до самого конца массива. Например, предположим, имеется скрипт:
<SCRIPT>
a = new Array();
a[0] = "Ant";
a[5] = "Zebra";
function writeArray(x) {
for (i = 0; i < x.length; i++) {
document.write(x[i]);
if (i < x.length-1) document.write(", ");
}
}
writeArray(a);
a.sort();
document.write("<BR><BR>");
writeArray(a);
</SCRIPT>
В JavaScript 1.1 печатается:
ant, null, null, null, null, zebra
ant, null, null, null, null, zebra
В JavaScript 1.2 печатается:
ant, undefined, undefined, undefined, undefined, zebra
ant, zebra, undefined, undefined, undefined, undefined
Примеры
В следующем примере создаются 4 массива и выводится оригинальный массив, затем - отсортированные массивы. Числовые массивы сортируются сначала без, а затем - с использованием функции compare.
<SCRIPT>
stringArray = new Array("Blue","Humpback","Beluga")
numericStringArray = new Array("80","9","700")
numberArray = new Array(40,1,5,200)
mixedNumericArray = new Array("80","9","700",40,1,5,200)
function compareNumbers(a, b) {
return a - b
}
document.write("<B>stringArray:</B> " + stringArray.join() +"<BR>")
document.write("<B>Sorted:</B> " + stringArray.sort() +"<P>")
document.write("<B>numberArray:</B> " + numberArray.join() +"<BR>")
document.write("<B>Sorted without a compare function:</B> " + numberArray.sort() +"<BR>")
document.write("<B>Sorted with compareNumbers:</B> " + numberArray.sort(compareNumbers) +"<P>")
document.write("<B>numericStringArray:</B> " + numericStringArray.join() +"<BR>")
document.write("<B>Sorted without a compare function:</B> " + numericStringArray.sort() +"<BR>")
document.write("<B>Sorted with compareNumbers:</B> " + numericStringArray.sort(compareNumbers) +"<P>")
document.write("<B>mixedNumericArray:</B> " + mixedNumericArray.join() +"<BR>")
document.write("<B>Sorted without a compare function:</B> " + mixedNumericArray.sort() +"<BR>")
document.write("<B>Sorted with compareNumbers:</B> " + mixedNumericArray.sort(compareNumbers) +"<BR>")
</SCRIPT>
Как показано на выводе, если используется функция compare, числа сортируются корректно вне зависимости от того, являются они числами или строками чисел:
stringArray: Blue,Humpback,Beluga
Sorted: Beluga,Blue,Humpback
numberArray: 40,1,5,200
Sorted without a compare function: 1,200,40,5
Sorted with compareNumbers: 1,5,40,200
numericStringArray: 80,9,700
Sorted without a compare function: 700,80,9
Sorted with compareNumbers: 9,80,700
mixedNumericArray: 80,9,700,40,1,5,200
Sorted without a compare function: 1,200,40,5,700,80,9
Sorted with compareNumbers: 1,5,9,40,80,200,700
См. также
,