2016-06-02 4 views
3

У меня есть массив в JavaScript, который выглядит, как этотСортировка массива строки дата

Array[9] 
0: "01/06/2016" 
1: "02/06/2016" 
2: "23/05/2016" 
3: "24/05/2016" 
4: "25/05/2016" 
5: "26/05/2016" 
6: "27/05/2016" 
7: "28/05/2016" 
8: "31/05/2016" 
length: 9__proto__: Array[0] 

я хочу заказать их так старейшая дата первая и самый последний является последней. я попробовал

days.sort(function(a,b) { 
    return new Date(a).getTime() - new Date(b).getTime() 
}); 

, но я предполагаю, что из-за формата даты? это не работает. что еще я мог попробовать?

ожидается выход

Array[9] 
0: "23/05/2016" 
1: "24/05/2016" 
2: "25/05/2016" 
3: "26/05/2016" 
4: "27/05/2016" 
5: "28/05/2016" 
6: "31/05/2016" 
7: "01/06/2016" 
8: "02/06/2016" 
length: 9__proto__: Array[0] 

ответ

4

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

new Date("01/06/2016") не анализируется, как вы думаете. Итогом является Jan 06 2016.

days = ["01/06/2016", "02/06/2016", "23/05/2016", "24/05/2016", "25/05/2016", "26/05/2016", "27/05/2016", "28/05/2016", "31/05/2016"]; 
 
days.sort(function(a, b) { 
 
    aArr = a.split('/'); 
 
    bArr = b.split('/'); 
 
    return new Date(aArr[2], Number(aArr[1])-1, aArr[0]).getTime() - new Date(bArr[2], Number(bArr[1])-1, bArr[0]).getTime() 
 
}); 
 
console.log(days);

+0

Спасибо большое, думая об этом, и, глядя на это он должен был из совершенно очевидно, на самом деле, может быть, я просто медлительности сегодня. спасибо –

+0

@JoshKirkpatrick Логика дат может быть немного сложной. Например, число, месяц начинается с '0' до' 11'. Как только вы привыкнете к этому, все будет хорошо. ;) Счастливое кодирование. – RRK

2

Это потому, что формат дата используется в вашем случае MM/DD/YYYY

new Date("01/06/2016"); 
> Wed Jan 06 2016 00:00:00 GMT+0100 (Mitteleuropäische Zeit) 

Смотрите также http://www.w3schools.com/js/js_date_formats.asp

Но из вашего списка я предполагаю ваши даты находятся в формате DD/MM/YYYY.

3 Возможные решения:

  • использовать другой формат в списке

  • Вы можете разделить вашу строку и создать даты с помощью new Date(year, month, day); в функции сортировки.

  • использовать продвинутую библиотеку даты/время, я рекомендую moment.js http://momentjs.com/

+0

Всегда любите давать подсказку, а не точное решение. –

0
var array= [ "01/06/2016" , 
"02/06/2016" , 
"23/05/2016" , 
"24/05/2016" , 
"25/05/2016" , 
"26/05/2016" , 
"27/05/2016" , 
"28/05/2016" , 
"31/05/2016" ]; 
array.sort(function (a, b) { 
var dateParts1 = a.split("/"); 
var dateParts2 = b.split("/"); 
var dateA=dateParts1[2]*360+ dateParts1[1]*30+ dateParts1[0]; 
var dateB=dateParts2[2]*360+ dateParts2[1]*30+ dateParts2[0]; 
    if (dateA > dateB) { 
    return 1; 
    } 
    if (dateA < dateB) { 
    return -1; 
    } 
    return 0; 
}); 
0

отделяйте синтаксические и сортировочно-операции и кэшировать промежуточные стоимости.

days = ["01/06/2016", "02/06/2016", "23/05/2016", "24/05/2016", "25/05/2016", "26/05/2016", "27/05/2016", "28/05/2016", "31/05/2016"]; 


days.map(v => { //parsing 
    var a = v.split("/"); 
    return { 
    value: v, 
    ts: +new Date(+a[2], a[1]-1, +a[0]) 
    } 
}) 
.sort((a,b) => a.ts - b.ts) //sorting 
.map(o => o.value); //returning the associated (input-)values 

Для n элементов в массиве ввода-, сортировка-функция может быть вызвана до n * (n-1) раза, в зависимости от реализуемого алгоритма сортировки-.
Это в этом случае, до 144 раз разбора такой строки, в худшем случае.

В самом лучшем случае (массив уже отсортирован) другие реализации здесь должны анализировать не менее 16 раз для этих 9 элементов. (8 сравнений * 2 строки для разбора)

Это может показаться не очень много (пока), но эти цифры увеличиваются экспоненциально.

0

Пожалуйста, попробуйте следующее:

var array = ["01/06/2016", "02/06/2016", "23/05/2016", "24/05/2016", "25/05/2016", "26/05/2016", "27/05/2016", "28/05/2016", "31/05/2016"]; 
 
    function dateString2Date(dateString) { 
 
     var dt = dateString.split(/\//); 
 
     return new Date(dt[2]+"-"+dt[1]+"-"+dt[0]); 
 
    } 
 
    for(var i =0 ; i<=array.length-2;i++){ 
 
     for(var j=i+1; j<=array.length-1;j++){ 
 
      if(dateString2Date((array[i])).getTime()/1000> dateString2Date((array[j])).getTime()/1000){ 
 
       var temp = array[i]; 
 
       array[i] = array[j]; 
 
       array[j] = temp; 
 
      } 
 
     } 
 
    } 
 

 
console.log(array)

+0

Вы только что заново изобрели 'Array.sort'. «. Грац – Jamiec

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