【问题标题】:Array Sort by time hh:mm:ss数组按时间排序 hh:mm:ss
【发布时间】:2019-12-26 14:37:11
【问题描述】:

我正在尝试对时间进行排序。但我无法按时间 (hh:mm:ss) 格式排序。所以我用了时刻js。我的数组按时间排序没有得到排序。如何使用地图对数组进行排序

我有一个对象数组:

let elements =[
  {
    "id": 1,
    "date": "02:01:02"
  },
  {
    "id": 2,
    "date": "01:01:01"
  },
  {
    "id": 3,
    "date": "03:01:01"
  },
  {
    "id": 4,
    "date": "04:01:01"
  }
 ]; 


 let parsedDates = new Map(
        elements.map(e =>[["id", "date"],[e.id, moment(e.date, 'hh:mm:ss')]])
        );

    elements.sort((a, b) => parsedDates.get(a) - parsedDates.get(b));

    console.log(elements.map(e => ({ id: e.id, date: e.date })));

【问题讨论】:

  • 矩有什么作用?
  • 你的代码的问题是parsedDates.get(b)parsedDates.get(a)返回undefined。由于无法对 Map 进行排序,请先对 elements 数组进行排序,然后从中创建一个 Map。
  • 传递给新Map 的数组没有多大意义。你到底想在那里完成什么?

标签: javascript arrays sorting


【解决方案1】:

您可以使用string.localeCompare() 对时间进行字典排序。

let times = [ { "id": 1, "date": "02:01:02" }, { "id": 2, "date": "01:01:01" }, { "id": 3, "date": "03:01:01" }, { "id": 4, "date": "04:01:01" } ];
times.sort((a,b) => a.date.localeCompare(b.date));
console.log(times);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

    【解决方案2】:

    你可以试试这个

    function convertDateObj(hhmmss){
    	let obj = new Date();//creates a Date Object using the clients current time
    
        let [hours,minutes,seconds] = hhmmss.split(':'); 
    
        obj.setHours(+hours); // set the hours, using implicit type coercion
        obj.setMinutes(minutes); //you can pass Number or String, it doesn't really matter
        obj.setSeconds(seconds);
        return obj;
    }
    
    let elements =[
      {
        "id": 1,
        "date": "02:01:02"
      },
      {
        "id": 2,
        "date": "01:01:01"
      },
      {
        "id": 3,
        "date": "03:01:01"
      },
      {
        "id": 4,
        "date": "04:01:01"
      }
     ]; 
    
    elements.sort((a, b) => convertDateObj(a.date) - convertDateObj(b.date)); // Ascending order
    
    elements.sort((a, b) => convertDateObj(b.date) - convertDateObj(a.date)); // Descending order

    【讨论】:

      【解决方案3】:

      您创建的 parsedDates 地图如下所示:

      Map {
        [ 'id', 'date' ] => [ 1, <some Date object> ],
        [ 'id', 'date' ] => [ 2, <some Date object> ],
        [ 'id', 'date' ] => [ 3, <some Date object> ],
        [ 'id', 'date' ] => [ 4, <some Date object> ]
      }
      

      然后您尝试使用以下元素从中提取:

      parsedDates.get({ "id": 1, "date": "02:01:02" })
      

      这应该不起作用,因为 Map 中的键是和 Array 实例。

      即使您使用数组作为键:

      parsedDates.get([ 1, "02:01:02" ])
      

      这仍然不起作用,因为这将是一个不同的对象引用。我的意思是两个数组

      a = [ 1, "02:01:02" ]
      b = [ 1, "02:01:02" ]
      

      存储在不同的地方,是不同的对象,即使它们的值相同。

      所以,你可以稍微修改一下你的解决方案:

      let elements =[
        {
          "id": 1,
          "date": "02:01:02"
        },
        {
          "id": 2,
          "date": "01:01:01"
        },
        {
          "id": 3,
          "date": "03:01:01"
        },
        {
          "id": 4,
          "date": "04:01:01"
        }
       ]; 
      
      let parsedDates = new Map(
            elements.map(e => [e.date, e])
            );
      
      elements = elements.map(x => x.date).sort().map(x => parsedDates.get(x))
      
      console.log(elements)
      
      // [
      //   { id: 2, date: '01:01:01' },
      //   { id: 1, date: '02:01:02' },
      //   { id: 3, date: '03:01:01' },
      //   { id: 4, date: '04:01:01' }
      // ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-22
        • 1970-01-01
        • 2017-04-03
        • 2014-07-24
        • 2016-01-15
        • 1970-01-01
        相关资源
        最近更新 更多