2016-04-13 2 views
1

У меня есть массив, как показано нижеСортировка массива строки, имеющей год и месяц

var testArr = ["2009-feb", "2009-jan", "2010-mar", "2010-jan", "2011-jul", "2011-sep", "2011-jan", "2012-jan", "2012-dec", "2012-feb", "2013-may", "2013-jul", "2013-jun", "2014-jan", "2014-dec", "2014-may", "2015-may", "2015-jan", "2015-jun", "2016-jan", "2016-dec"]; 

Мне нужно сортировать их я следующий

var sortOrder="asc"; 
testArr.sort(function (a, b) { 
    if (sortOrder == "asc") { 
     return a.localeCompare(b); 
    } 
    else { 
     return b.localeCompare(a); 
    } 
}); 

из положить является

["2009-feb","2009-jan","2010-jan","2010-mar","2011-jan","2011-jul","2011-sep","2012-dec","2012-feb","2012-jan","2013-jul","2013-jun","2013-may","2014-dec","2014-jan","2014-may","2015-jan","2015-jun","2015-may","2016-dec","2016-jan"] 

что неправильно.

+0

А что пошло не так? – Rayon

+0

Я не вижу конкретного вопроса. – lurker

+0

Он ищет сортировку по дате, но не в алфавитном порядке. –

ответ

0

Вы можете использовать функцию, которая разделяет строку даты и возвращает массив с годом и номер месяца. Месяц берется из объекта с именами месяцев как хэши.

function yearMonth(a, b) { 
 
    function getDate(f) { 
 
     var d = f.split('-'); 
 
     d[1] = { 
 
      jan: 1, feb: 2, mar: 3, apr: 4, may: 5, jun: 6, jul: 7, aug: 8, sep: 9, oct: 10, nov: 11, dec: 12 
 
     }[d[1].substring(0, 3).toLowerCase()] || 0; 
 
     return d; 
 
    } 
 

 
    var aa = getDate(a), 
 
     bb = getDate(b); 
 

 
    return aa[0] - bb[0] || aa[1] - bb[1]; 
 
} 
 

 
var testArr = ["2009-feb", "2009-jan", "2010-mar", "2010-jan", "2011-jul", "2011-sep", "2011-jan", "2012-jan", "2012-dec", "2012-feb", "2013-may", "2013-jul", "2013-jun", "2014-jan", "2014-dec", "2014-may", "2015-may", "2015-jan", "2015-jun", "2016-jan", "2016-dec"], 
 
    testArr1 = ["2009-February", "2009-January", "2010-March", "2010-January", "2011-July", "2011-September", "2011-January", "2012-January", "2012-December", "2012-February", "2013-May", "2013-July", "2013-June", "2014-January", "2014-December", "2014-May", "2015-May", "2015-January", "2015-June", "2016-January", "2016-December"]; 
 

 
testArr.sort(yearMonth); 
 
testArr1.sort(yearMonth); 
 

 
document.write('<pre>' + JSON.stringify(testArr, 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(testArr1, 0, 4) + '</pre>');

+0

Какова цель использования или оператора '||' in '} [d [1] .substring (0, 3) .toLowerCase()] || 0; ' – ozil

+1

- это значение по умолчанию, если в объекте не найден месяц. –

0

Для первого массива, попробуйте этот

var monthArray = ["jan","feb", "mar", "apr", "may", "june", "july", "aug", "sep", "oct", "nov", "dec"]; 

testArr.sort(function(a,b){ 
    var ayearmonth = a.split("-"); 
    var byearmonth = b.split("-"); 
    var montha = monthArray.indexOf(ayearmonth); 
    var monthb = monthArray.indexOf(byearmonth); 
    if(ayearmonth[0] != byearmonth[0]) 
    { 
    return ayearmonth[0] - byearmonth[0]; 
    } 
    { 
    return montha-monthb; 
    } 
}); 

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

1

Я предполагаю, что вы имеете в виду сортировка по дате, то

testArr.sort(function(dateA, dateB) { 
    return new Date(dateA) - new Date(dateB) 
}) 

Если вы хотите свежие даты первого флип dateA с dateB.

пример Run на тонике: https://tonicdev.com/lipp/sort-dates

1

Попробуйте как этот

FIDDLE DEMO

var sortOrder="asc"; 
testArr.sort(function (a, b) { 
    if (sortOrder == "asc") { 
     return new Date(Date.Parse(b)) - new Date(Date.Parse(a)); 
    } 
    else { 
     return new Date(Date.Parse(a)) - new Date(Date.Parse(b)); 
    } 
}); 
0

Вы можете написать свой собственный метод пользовательских comparison и передать в sort методу. Вот простая демонстрация для этого.

var months = [ "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"] 
 

 
var testArr = ["2009-feb", "2009-jan", "2010-mar", "2010-jan", "2011-jul", "2011-sep", "2011-jan", "2012-jan", "2012-dec", "2012-feb", "2013-may", "2013-jul", "2013-jun", "2014-jan", "2014-dec", "2014-may", "2015-may", "2015-jan", "2015-jun", "2016-jan", "2016-dec"]; 
 
var testArr1 = ["2009-February", "2009-January", "2010-March", "2010-January", "2011-July", "2011-September", "2011-January", "2012-January", "2012-December", "2012-February", "2013-May", "2013-July", "2013-June", "2014-January", "2014-December", "2014-May", "2015-May", "2015-January", "2015-June", "2016-January", "2016-December"]; 
 

 
var sortOrder="asc"; 
 
var compare = function(a, b) { 
 
    var aParts = a.toLowerCase().split("-"); 
 
    var bParts = b.toLowerCase().split("-"); 
 
    
 
    var dateA = new Date(parseInt(aParts[0]), months.indexOf(aParts[1].substring(0, 3))); 
 
    var dateB = new Date(parseInt(bParts[0]), months.indexOf(bParts[1].substring(0, 3))); 
 
    
 
    if (sortOrder === "asc") 
 
    return dateA - dateB; 
 
    else 
 
    return dateB - dateA; 
 
} 
 

 
var sortedTestArr = testArr.sort(compare); 
 
var sortedTestArr1 = testArr1.sort(compare); 
 

 

 
document.write('<pre>' + JSON.stringify(sortedTestArr, 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(sortedTestArr1, 0, 4) + '</pre>');

0

Использование Подчеркивание JS сортировать по дате

Пример как: -

var newConsultantData = _.sortBy(consultantData, function(o) { return o.created; }); 
Смежные вопросы