2017-02-20 7 views
0

Я создаю очень простой скрипт сортировки массива, он работает на Firefox, но хром и т. Д. Дает мне неупорядоченный массив.Действительно ли это массив, сортирующий ошибку хром и т. Д.?

var arr = ["2017-02-17", 
"2017-02-17", 
"2017-02-16", 
"2017-02-15", 
"2017-02-16", 
"2017-02-15", 
"2017-02-14", 
"2017-02-16", 
"2017-02-17", 
"2017-02-17", 
"2017-02-13"]; 
arr.sort(function(a, b) {return a>b;}); 
console.log(arr); 

Is is chrome/ie bug или я что-то пропустил? Я почти не верю, что хром и т. Е. Имеют разный двигатель.

+0

просто вызывая обр.сортировки() будет делать – user93

+0

Забыли формат данных, попробуйте уаг обр = [ "17", "17", "16", "15", "16", "15", "14", "16", "17", "17", "13"]; Он также возвращает мне неупорядоченный список. – user3631204

ответ

1

Вам нужно просто сортировать, не передавая функцию callback.

arr.sort(); 

var arr = ["2017-02-17", 
 
"2017-02-17", 
 
"2017-02-16", 
 
"2017-02-15", 
 
"2017-02-16", 
 
"2017-02-15", 
 
"2017-02-14", 
 
"2017-02-16", 
 
"2017-02-17", 
 
"2017-02-17", 
 
"2017-02-13"]; 
 
arr.sort(); 
 
console.log(arr);

2

Вы можете использовать правильное сравнение для Array#sort и использовать его в качестве возвращаемого значения, вместо одного true/false, который не исключает отрицательное значение, которое необходимо.

У вас есть ISO 6801 строки даты, вы можете использовать для этого.

var arr = ["2017-02-17", "2017-02-17", "2017-02-16", "2017-02-15", "2017-02-16", "2017-02-15", "2017-02-14", "2017-02-16", "2017-02-17", "2017-02-17", "2017-02-13"]; 
 

 
arr.sort(function(a, b) { 
 
    return a.localeCompare(b); 
 
}); 
 
console.log(arr);

И если вы не заботитесь о Unicode кодовых точек, вы могли бы использовать Array#sort

Метод sort() сортирует элементы массива на месте и возвращает массив. Сорт не обязательно стабильный. Порядок сортировки по умолчанию соответствует строковым кодам Unicode.

без compareFunction

var arr = ["2017-02-17", "2017-02-17", "2017-02-16", "2017-02-15", "2017-02-16", "2017-02-15", "2017-02-14", "2017-02-16", "2017-02-17", "2017-02-17", "2017-02-13"]; 
 

 
arr.sort(); 
 
console.log(arr);

+2

это выглядит как хорошо сформированная дата ISO для меня, –

+0

Просто обратите внимание, что коды кодов Unicode на самом деле не применяются здесь, поскольку все символы в приведенных строках даты находятся в пределах диапазона ASCII (при условии, что используется обычная «тире»/-), поэтому sort() должен быть довольно стабильным. – K3N

+0

@ K3N, правый, в этом случае. Я думал, я должен упомянуть разницу между сортировкой без callback и localeCompare. –

2

Поскольку у вас есть даты в виде строки, всегда лучше создавать дату и проверить равенство.

Сравнение строки может иметь проблемы, так как вы можете иметь дату из любого формата. Классическим примером будет yyyy-m-d.

В сравнении строк, 2017-1-12 больше, чем 2017-08-17.

var arr = ["2017-02-17", "2017-02-17", "2017-02-16", "2017-02-15", "2017-02-16", "2017-02-15", "2017-02-14", "2017-02-16", "2017-02-17", "2017-02-17", "2017-02-7", "2017-02-13"]; 
 

 
arr.sort(function(a, b) { 
 
    var d1 = new Date(a); 
 
    var d2 = new Date(b); 
 
    return +d1 - +d2; 
 
}) 
 

 
console.log(arr)


Примечание: Как отметил @K3N, если вход будет всегда в формате ISO, то вы можете использовать любой способ для сравнения строк (например, @Nina Scholz's answer). Но если есть возможность получить ввод в любом другом формате, я бы предложил вместо этого сравнить объекты Date.

+0

Они выглядят в формате ISO и должны сортироваться как штрафы как строки (по умолчанию для Array.sort()). Проблема заключается в возвращаемом значении, которое должно быть -1/0/1, а не булевом. – K3N

+0

Правда, если это так, но если в формате ISO (yyyy-mm-dd) дата будет 2017-01-12 и не вызовет никаких проблем. – K3N

+1

@ K3N Обновил свой ответ с оговоркой и зачислил вас. Я по-прежнему придерживаюсь своего подхода, так как это поможет людям с непоследовательным форматом. :-) – Rajesh

Смежные вопросы