如何使用javascript对日期格式的数组进行排序,最新记录位于顶部

问题描述 投票:0回答:3

我有一个数组

let array = [
  {clmFirstReceivedDt: "16/03/2023"},
  {clmFirstReceivedDt: "17/03/2022"},
  {clmFirstReceivedDt: "13/04/2024"},
  {clmFirstReceivedDt: "06/03/2024"},
  {clmFirstReceivedDt: "06/02/2024"},
  {clmFirstReceivedDt: "12/03/2024"}
];

当我尝试时,我的日期格式为日、月、年

array.sort((a, b) => {
      const dateA = new Date(a.clmFirstReceivedDt).getTime();
      const dateB = new Date(b.clmFirstReceivedDt).getTime();
      return dateB - dateA;
    });

当格式为月、日、年时,它工作正常,但是当日期格式更改时,顺序无法正确排序

javascript
3个回答
0
投票

不应依赖

Date
构造函数如何解析此类字符串。相反,您可以构建可以按词法排序的字符串或其等效的数字。在这里,我重新排列数字部分以创建一个大数字(yyyymmdd),然后它就可以工作了:

let array = [
  {clmFirstReceivedDt: "16/03/2023"},
  {clmFirstReceivedDt: "17/03/2022"},
  {clmFirstReceivedDt: "13/04/2024"},
  {clmFirstReceivedDt: "06/03/2024"},
  {clmFirstReceivedDt: "06/02/2024"},
  {clmFirstReceivedDt: "12/03/2024"}
];

array.sort((a, b) => {
    // Extract the numeric parts and rejoin them in the propper order
    const dateA = a.clmFirstReceivedDt.replace(/(..)\/(..)\/(.*)/, "$3$2$1");
    const dateB = b.clmFirstReceivedDt.replace(/(..)\/(..)\/(.*)/, "$3$2$1");
    return dateB - dateA; // for descending order
});

console.log(array);


0
投票

如果您想对 dd/mm/yy 格式的日期进行排序 ->

let array = [
    {clmFirstReceivedDt: "16/03/2023"},
    {clmFirstReceivedDt: "17/03/2022"},
    {clmFirstReceivedDt: "13/04/2024"},
    {clmFirstReceivedDt: "06/03/2024"},
    {clmFirstReceivedDt: "06/02/2024"},
    {clmFirstReceivedDt: "12/03/2024"}
];

function compareDatesDescending(a, b) {
    const dateA = a.clmFirstReceivedDt.split('/').reverse().join('/');
    const dateB = b.clmFirstReceivedDt.split('/').reverse().join('/');
    if (dateA < dateB) {
        return 1;
    } else if (dateA > dateB) {
        return -1;
    } else {
        return 0;
    }
}

array.sort(compareDatesDescending);
console.log(array);

希望这有帮助:)


0
投票

为了确保无论日期格式如何都能正确排序,您应该在创建 Date 对象之前手动解析日期字符串。您可以通过拆分日期字符串并创建一个新的 Date 对象来实现此目的,其中年、月和日的顺序正确。

let array = [
  {clmFirstReceivedDt: "16/03/2023"},
  {clmFirstReceivedDt: "17/03/2022"},
  {clmFirstReceivedDt: "13/04/2024"},
  {clmFirstReceivedDt: "06/03/2024"},
  {clmFirstReceivedDt: "06/02/2024"},
  {clmFirstReceivedDt: "12/03/2024"}
];

array.sort((a, b) => {
  const getDateFromString = (dateString) => {
    const [day, month, year] = dateString.split('/');
    return new Date(`${year}-${month}-${day}`).getTime();
  };

  const dateA = getDateFromString(a.clmFirstReceivedDt);
  const dateB = getDateFromString(b.clmFirstReceivedDt);
  
  return dateB - dateA;
});

console.log(array);

© www.soinside.com 2019 - 2024. All rights reserved.