Сортировка массива Javascript с Chrome?

Есть ли способ сортировки массива с помощью Chrome?


Использование функции сортировки не работает в этом примере:

var myArray = [1,4,5,3,2];

myArray.sort ( function( a , b ){
  return b>a
});

for ( var i = 0; i < myArray.length; i++ )
{
  document.write( myArray[i] )
}

Выход Firefox/IE/Opera/Safri: 54321

Выход Chrome: 53241

Пример jsBin


Спасибо за ваше время!

Ответ 1

Это кажется стандартным, возвращает отрицательное, положительное или нулевое число.

myArray.sort ( function( a , b ){
  return a-b;
});

http://www.w3schools.com/jsref/jsref_sort.asp

Ответ 2

Поведение Chrome верное:)

Стандарты ECMA требуют, чтобы функция передавалась sort(), чтобы вернуть число больше 0, меньше 0 или равно 0. Однако функция, которую вы определили, возвращает true/false. Стандарты ECMA указывают, что для функции, которая не ведет себя так, как ожидалось, реализация зависит от клиента.

Прочтите это

Ответ 3

Из-за того, что стандарт ECMA распространяется на сортировочные массивы (очень упрощенным способом):

  • Если при сравнении получается 1 A, опуститесь на одну позицию.
  • Если получает -1, сохраняют позицию и определяют верхний рейтинг к B.
  • Если принимает 0, ничего не делает.

Самый безопасный способ гарантировать одинаковое поведение во всех браузерах:

// descending order
abc =[10,2,4,1]; 
abc.sort(function( a , b ){
  return a > b ? -1 : 1;
});

// ascending order
abc.sort(function( a , b ){
  return a > b ? 1 : -1;
});

Для примитивных объектов можно использовать короткую версию

// descending order
abc.sort(function( a , b ){
  return b - a; 
});

// ascending order
abc.sort(function( a , b ){
  return a - b; 
});

для объектов типа:

var items = [
       { name: 'Edward', value: 21 },
       { name: 'Sharpe', value: 27 },
       { name: 'And', value: 31 },
       { name: 'The', value: -12 },
       { name: 'Zeros', value: 37 },
       { name: 'Magnetic', value: 37 }  

Правильный путь:

 items.sort(function( a , b ){
   var result = a == b ? 0 : b > a ? -1 : 1
   if(result === 0)
   {
     // implement a tight break evaluation
   }
   return result ;
  });

Это правильный путь, потому что способ, которым выполняет итерации браузера, не определен в стандарте ECMA, и браузер может итератировать по-разному. Например, большинство браузеров повторяются сверху вниз, но хром выполняет итерацию 1-го элемента с последним и продвигается вверх. Таким образом, в случае сбоя может возникнуть другой результат большинства браузеров.