将基于DATE的数组对象排序为字符串

问题描述 投票:-3回答:2

我需要根据日期对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'},
]
javascript arrays
2个回答
0
投票

您可以按对象的任何键进行排序,只需要自己构建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;
})

0
投票

您应该将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 )
© www.soinside.com 2019 - 2024. All rights reserved.