JavaScript IE 9: пользовательская функция сортировки - PullRequest
1 голос
/ 21 сентября 2011

В IE 9, если я наберу это в консоли:

[1, 4, 2, 3].sort(function (a, b) { return a < b; });

Полученный массив: [1, 4, 2, 3].

Если я делаю это в FF / Chrome, я получаю его в обратном порядке: [4, 3, 2, 1].

Почему это не работает в IE?

РЕДАКТИРОВАТЬ: Есть ли функция, которая абстрагирует эти различия браузера? Другими словами, есть ли функция, которую я могу передать function (a, b) {return a

1 Ответ

8 голосов
/ 21 сентября 2011

Возможно, потому что функция должна возвращать -1, если a меньше, 0, если они равны, и 1, если a больше (или наоборот, если вы хотите изменить порядок). Редактировать: На самом деле это должно быть ноль, положительное или отрицательное число (как указал @pimvdb, и это то, что я использую в приведенном ниже примере). Ваша функция никогда не вернет -1, и это может создать проблемы.

Рассмотрим 1 и 3. Ваша функция возвращает 1 для 1 < 3, что нормально, но возвращает 0 для 3 < 1. В одном случае число отличается, в другом вы говорите, что они равны.

То, что FF / Chrome сортируют его в обратном порядке, может быть связано с алгоритмом сортировки, который они используют.

Попробуйте:

[1, 4, 2, 3].sort(function (a, b) { return b - a; });

Обновление: Чтобы подтвердить это, мы можем взглянуть на спецификацию, раздел 15.4.4.11 Array.prototype.sort (comparefn ), где указаны свойства, которые имеют Для выполнения функции сравнения:

Функция comparefn является непротиворечивой функцией сравнения для набора значений S, если все приведенные ниже требования выполнены для всех значений a , b и c (возможно, то же значение) в наборе S: запись a <<sub> CF b означает сравнить (а, б) <0; <em>a = CF b означает comparefn (a, b) = 0 (любого знака); и a > CF b означает сравнениеf (a, b) > 0.

  • Вызов comparefn (a, b) всегда возвращает одно и то же значение v, если задана определенная пара значений a и b в качестве двух аргументов. Кроме того, тип ( v ) является числом, а v не является NaN . Обратите внимание, что это означает, что точно один из a <<sub> CF b , a = CF b и a > CF b будет истинным для данная пара a и b .
  • Вызов comparefn (a, b) не изменяет объект this .
  • a = CF a (рефлексивность)
  • Если a = CF b , то b = CF a (симметрия)
  • Если a = CF b и b = CF c , затем a = CF c (транзитивность = CF )
  • Если a <<sub> CF b и b <<sub> CF c , затем a <<sub> CF c (транзитивность <<sub> CF )
  • Если a > CF b и b > CF c , затем a > CF c (транзитивность> CF )

ПРИМЕЧАНИЕ. Вышеуказанные условия необходимы и достаточны для того, чтобы comparefn делил множество S на классы эквивалентности и чтобы эти классы эквивалентности были полностью упорядочены.

...