【问题标题】:Sorting array of objects based on date根据日期对对象数组进行排序
【发布时间】:2016-12-03 16:04:55
【问题描述】:

我有一个类似于...的对象数组

[
  {
    date: "26/11/2016"
    hourlyRate: 50
    hoursWorked: 10
    name: "Mr G"
    natInsNumber: "GG845893G"
  },
  {
    date: "14/10/2016"
    hourlyRate: 50
    hoursWorked: 10
    name: "Mr A"
    natInsNumber: "GG845893G"
  },
  {
    date: "11/09/2016"
    hourlyRate: 50
    hoursWorked: 10
    name: "Mr H"
    natInsNumber: "GG845893G"
  },
  {
    date: "26/10/2016"
    hourlyRate: 50
    hoursWorked: 10
    name: "Mr L"
    natInsNumber: "GG845893G"
  }
]

我需要根据最近的日期对该列表进行排序。

基于我看到的类似问题,这是我的解决方案代码,数组作为records 参数传入...

function sortRecords (records) {

  var sorted = records.sort(function(a, b){
    return new Date(a.date) - new Date(b.date); 
  });

  return sorted;

}

谁能告诉我为什么这不起作用?我只是取回相同的未排序数组....

【问题讨论】:

    标签: javascript arrays sorting javascript-objects


    【解决方案1】:

    这是因为您的日期字符串无法解析为有效日期,您需要重新排列您传递给new Date() 的字符串。例如,以下将产生一个可解析的日期:

    function rearrangeDate(dateString) {
        var r = dateString.split('/');
      return r[1] + "/" + r[0] + "/" + r[2];
    }
    

    然后你就可以使用了

    function sortRecords (records) {
    
      var sorted = records.sort(function(a, b){
        return new Date(rearrangeDate(a.date)) - new Date(rearrangeDate(b.date)); 
      });
    
      return sorted;
    
    }
    

    【讨论】:

    • 只是缺少一个 + 来连接函数中的字符串
    【解决方案2】:

    试试这个

        let sorted = 
         [{
            date: "26/11/2016",
            hourlyRate: 50,
            hoursWorked: 10,
            name: "Mr G",
            natInsNumber: "GG845893G"
        },
        {
            date: "14/10/2016",
            hourlyRate: 50,
            hoursWorked: 10,
            name: "Mr A",
            natInsNumber: "GG845893G"
        },
        {
            date: "11/09/2016",
            hourlyRate: 50,
            hoursWorked: 10,
            name: "Mr H",
            natInsNumber: "GG845893G"
        },
        {
            date: "26/10/2016",
            hourlyRate: 50,
            hoursWorked: 10,
            name: "Mr L",
            natInsNumber: "GG845893G"
        }
    ];
    
    function CreateDate(dateString) {
        var arr = dateString.split('/');
        return new Date(arr[2] , arr[1], arr[0]);
    }
    
    function sortRecords(records) {    
        var sorted = records.sort(function (a, b) {        
            return CreateDate(a.date) > CreateDate(b.date);
        });
        console.log(sorted);
    }
    

    sortRecords(sorted);

    产生以下输出:

    【讨论】:

    • 非常感谢 :) 虽然我在控制台中得到了这个工作,因为它在我的代码中没有工作。我似乎对如何处理从异步调用到服务器的数据有问题,对象数组在每个对象键值对之间返回时没有逗号。我会尝试解决这个问题,然后这应该可以解决我的排序问题。
    【解决方案3】:

    您还可以通过反转当前的 day-month-year 根据 year-month-day 对日期进行排序:

    var list = [
      {
        date: "26/11/2016",
        hourlyRate: 50,
        hoursWorked: 10,
        name: "Mr G",
        natInsNumber: "GG845893G"
      },
      {
        date: "30/10/2016",
        hourlyRate: 50,
        hoursWorked: 10,
        name: "Mr A",
        natInsNumber: "GG845893G"
      },
      {
        date: "11/09/2016",
        hourlyRate: 50,
        hoursWorked: 10,
        name: "Mr H",
        natInsNumber: "GG845893G"
      },
      {
        date: "26/10/2016",
        hourlyRate: 50,
        hoursWorked: 10,
        name: "Mr L",
        natInsNumber: "GG845893G"
      }
    ]
    var result = list.sort((a,b) => a.date.split("/").reverse().join("") - b.date.split("/").reverse().join(""));
    console.log(result);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 2019-05-12
      • 2013-11-25
      • 1970-01-01
      相关资源
      最近更新 更多