【问题标题】:How to sort an array of objects by date?如何按日期对对象数组进行排序?
【发布时间】:2013-10-26 04:04:29
【问题描述】:

我正在尝试对一个对象数组进行排序,每个对象包含:

var recent = [{id: "123",age :12,start: "10/17/13 13:07"} , {id: "13",age :62,start: "07/30/13 16:30"}];

日期格式为:mm/dd/yy hh:mm

我想按日期顺序排序,最近的在前。如果日期相同,则应按时间部分排序。

我尝试了下面的sort() 函数,但它不起作用:

recent.sort(function(a,b))
{
    a = new Date(a.start);
    b = new Date(b.start);
    return a-b;
});

另外,我应该如何遍历对象进行排序?比如:

for (var i = 0; i < recent.length; i++)
    {
        recent[i].start.sort(function (a, b)
        {
            a = new Date(a.start);
            b = new Date(b.start);
            return a-b; 
        } );
    }

数组中可以有任意数量的对象。

【问题讨论】:

    标签: javascript arrays sorting date


    【解决方案1】:

    ES6:

    recent.sort((a,b)=> new Date(b.start).getTime()-new Date(a.start).getTime());
    

    【讨论】:

      【解决方案2】:

      此函数允许您创建一个比较器,该比较器将遍历您想要比较的键的路径:

      function createDateComparator ( path = [] , comparator = (a, b) => a.getTime() - b.getTime()) {
        return (a, b) => {
          let _a = a
          let _b = b
          for(let key of path) {
            _a = _a[key]
            _b = _b[key]
          }
          return comparator(_a, _b)
        }
      }
      
      
      const input = (
        [ { foo: new Date(2017, 0, 1) }
        , { foo: new Date(2018, 0, 1) }
        , { foo: new Date(2016, 0, 1) }
        ]
      )
      
      const result = input.sort(createDateComparator([ 'foo' ]))
      
      console.info(result)

      【讨论】:

        【解决方案3】:

        正如 cmets 中所指出的,最近的定义不是正确的 javascript。

        但假设日期是字符串:

        var recent = [
            {id: 123,age :12,start: "10/17/13 13:07"}, 
            {id: 13,age :62,start: "07/30/13 16:30"}
        ];
        

        然后这样排序:

        recent.sort(function(a,b) { 
            return new Date(a.start).getTime() - new Date(b.start).getTime() 
        });
        

        More details on sort function from W3Schools

        【讨论】:

        【解决方案4】:
        recent.sort(function(a,b) { return new Date(a.start).getTime() - new Date(b.start).getTime() } );
        

        【讨论】:

        • 减去 Date 对象显然返回与减去它们的 getTime() 值相同的东西,尽管我在任何规范中都找不到这个要求。
        • 是的,我注意到,尽管 getTime() 将始终保持一致,并且由于 OP 希望在排序时显式使用时间组件,因此具体化是有意义的。
        • 更大的兼容性问题可能是解析mm/dd/yy格式不便携。
        • 这很好。一般来说,如果你需要便携,应该使用 ISO 日期。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        相关资源
        最近更新 更多