2009-12-28 4 views
21

Есть ли способ сортировки массива с помощью Chrome?Сортировка массива Javascript с 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 example


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

ответ

30

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

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

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

+0

такое же решение не работает, если дата сортировки в таком формате «мм/дд/гггг» –

13

Поведение Chrome правильно :)

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

Read this

3

Я думаю, правильная причина здесь: Sorting an array of objects in Chrome, более конкретно, this post.

Сообщение чтения, что, если вы чувствуете необходимость реализовать свою собственную функцию сортировки массива, вы можете посмотреть по адресу: http://en.literateprograms.org/Merge_sort_%28JavaScript%29

+0

Я немного опаздываю на вечеринку здесь и прощаю, если я не понимаю, но ссылка, которую вы дали, обсуждает стабильность Сортировка Chrome, когда несколько элементов будут оцениваться с одинаковым рангом. Но это не та же проблема, что и в случае заданного здесь вопроса, где каждый элемент имеет отличный ранг. –

5

Из-за того, что 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-го элемента с последним и продвигается вверх. Таким образом, в случае жесткости может возникнуть другой результат большинства браузеров.