2016-04-13 206 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

在'} [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。

上進補運行例如: 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; });