Ядро JavaScript 1.5. Справочник

Sort


Сортирует элементы массива.

Метод из

Реализован вJavaScript 1.1, NES 2.0

JavaScript 1.2: модифицировано поведение.

Версия ECMAECMA-262


Синтаксис

sort(compareFunction)


Параметры

compareFunction

Специфицирует функцию, которая определяет порядок сортировки. Если опущен, массив сортируется лексикографически (в словарном порядке) в соответствии с конверсией в строку каждого элемента.




Описание

Если compareFunction

не предоставляется, элементы сортируются путём конвертирования их в строки и сравнения строк в лексикографическом порядке ("словарь" или "телефонная книга," не числовой порядок). Например, "80" встанет перед "9" в лексикографическом порядке, но при числовой сортировке 9 встанет перед 80.

Если compareFunction

предоставляется, массив элементов сортируется в соответствии с return-значением функции сравнения. Если a и b это два сравниваемых элемента, тогда:

  • Если compareFunction(a, b) меньше 0, сортирует от b к a меньший индекс, чем a.
  • Если compareFunction(a, b) возвращает 0, оставляет a и b без изменений друг относительно друга, но сортирует с учётом всех отличающихся элементов.
  • Если compareFunction(a, b) больше 0, сортирует от b к a больший индекс, чем a.
  • Итак, функция 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

    См. также

    ,



    Содержание раздела