我需要根据日期对JSON对象进行排序,我分别具有月份和年份以及具有月份和年份的日期,但是它采用字符串形式。我尝试了不同的方法,但是由于它是字符串形式,因此有时无法以正确的方式进行排序。
const mockData = [
{country: "CAN", startYear: 2015, startMonth: 2, endYear: 2030, startDate: 'FEB 2015'},
{country:"IND", startYear: 2010, startMonth: 5, endYear: 2028, startDate: 'MAY 2010'},
{country: "JPN", startYear: 2020, startMonth: 8, endYear: 2024, startDate: 'AUG 2020'},
{country: "BRA", startYear: 2015, startMonth: 12, endYear: 2023, startDate: 'DEC 2015'}
];
所以我需要根据startDate对它进行排序
所需的输出:
[
{country:"IND", startYear: 2010, startMonth: 5, endYear: 2028, startDate: 'MAY 2010'},
{country: "CAN", startYear: 2015, startMonth: 2, endYear: 2030, startDate: 'FEB 2015'},
{country: "BRA", startYear: 2015, startMonth: 12, endYear: 2023, startDate: 'DEC 2015'},
{country: "JPN", startYear: 2020, startMonth: 8, endYear: 2024, startDate: 'AUG 2020'},
]
您可以按对象的任何键进行排序,只需要自己构建sorting method:
mockData.sort(function(a, b) {
if (a.startYear < b.startYear || (a.startYear == b.startYear && a.startMonth < b.startMonth) || (a.startYear == b.startYear && a.startMonth == b.startMonth && a.endYear < b.endYear)) return -1;
else if (a.startYear == b.startYear && a.startMonth == b.startMonth && a.endYear == b.endYear) return 0;
else return 1;
})
您应该将startDate转换为类似'2010 08'的字符串(2010年8月)
所以代码可以是类似的东西
const convertDate = str => {
let [month, year] = str.split(' ')
month = { JAN: '01', FEB: '02' ... DEC: '12' } [month]
return year + ' ' + month
}
arr.sort((a, b) => convertDate(a.startDate) < convertDate(b.startDate) ? -1 : 1 )
或仅使用数字字段
arr.sort((a, b) => a.startYear - b.startYear || a.startMonth -b.startMonth )