代码之家  ›  专栏  ›  技术社区  ›  Liz Parody

按ISOString日期对JavaScript嵌套对象排序

  •  -1
  • Liz Parody  · 技术社区  · 6 年前

    我有这个对象,我想返回一个按升序日期排序的新对象,考虑到startTime是一个ISOString。(我也在使用moment)我该怎么做?

    const clinics = {
      "a0CW00000027OX3MAM": {
        "id": "a0CW00000027OX3MAM",
        "companyName": "Hendrick Medical Center",
        "startTime": "2018-08-10T05:30:00.000Z",
      },
      "a0CW00000026gjJMAQ": {
        "id": "a0CW00000026gjJMAQ",
        "companyName": "ABC Manufacturing",
        "startTime": "2018-08-10T10:36:00.000Z",
      },
      "a0CW00000026gipMAA": {
        "id": "a0CW00000026gipMAA",
        "companyName": "ABC Manufacturing",
        "startTime": "2018-08-01T10:36:00.000Z",
      }
    }
    
    2 回复  |  直到 6 年前
        1
  •  3
  •   fubar    6 年前

    以下将按开始时间按升序对诊所进行排序。

    const clinics = {
      "a0CW00000027OX3MAM": {
        "id": "a0CW00000027OX3MAM",
        "companyName": "Hendrick Medical Center",
        "startTime": "2018-08-10T05:30:00.000Z",
      },
      "a0CW00000026gjJMAQ": {
        "id": "a0CW00000026gjJMAQ",
        "companyName": "ABC Manufacturing",
        "startTime": "2018-08-10T10:36:00.000Z",
      },
      "a0CW00000026gipMAA": {
        "id": "a0CW00000026gipMAA",
        "companyName": "ABC Manufacturing",
        "startTime": "2018-08-01T10:36:00.000Z",
      }
    };
    
    const sorted = Object.values(clinics)
      .sort((a, b) => a.startTime > b.startTime)
      .reduce((m, c) => m.set(c.id, c), new Map());
    
    for (let [key, value] of sorted.entries()) {
      console.log(key, value);
    }

    编辑 -答案更新为使用 Map ,以保证财产秩序。

        2
  •  2
  •   Adam H    6 年前

    好吧,你的对象不是一个数组,所以如果不先将它转换成一个数组,你就不能对它进行真正的排序。下面是一个将其转换为数组,然后仅使用字段文本进行排序的示例,因为ISO会以这种方式进行很好的排序。

    编辑 我更新了它以添加一个函数将其转换回对象

    const clinics = {
      "a0CW00000027OX3MAM": {
        "id": "a0CW00000027OX3MAM",
        "companyName": "Hendrick Medical Center",
        "startTime": "2018-08-10T05:30:00.000Z",
      },
      "a0CW00000026gjJMAQ": {
        "id": "a0CW00000026gjJMAQ",
        "companyName": "ABC Manufacturing",
        "startTime": "2018-08-10T10:36:00.000Z",
      },
      "a0CW00000026gipMAA": {
        "id": "a0CW00000026gipMAA",
        "companyName": "ABC Manufacturing",
        "startTime": "2018-08-01T10:36:00.000Z",
      }
    }
    
    function compare(a,b) {
      if (a.startTime < b.startTime)
         return -1;
      if (a.startTime > b.startTime)
        return 1;
      return 0;
    }
    
    function objectToArray(obj){
    	var keys = Object.keys(obj);
      var ret = [];
      for (var i = 0; i < keys.length; i++)
      	ret.push(obj[keys[i]]);
        
      return ret;
    }
    
    function arrayToObject(arr){
    	var ret = {};
      for(var i = 0; i < arr.length; i++)
        ret[arr[i].id] = arr[i];
      return ret;
    }
    
    var arr = objectToArray(clinics);
    console.log(arr.sort(compare));
    console.log(arrayToObject(arr));