对JSON数组对象进行排序

Sort JSON array object

本文关键字:排序 对象 JSON 数组      更新时间:2023-09-26

我有以下问题:我有这个JSON响应,例如:

[{
    "titulo": "Materia",
    "horaInicio": {
        "h": "08",
        "m": "00"
    },
    "horaFin": {
        "h": "10",
        "m": "00"
    }
}, {
    "titulo": "Materia2",
    "horaInicio": {
        "h": "7",
        "m": "00"
    },
    "horaFin": {
        "h": "11",
        "m": "00"
    }
}, {
    "titulo": "Materia3",
    "horaInicio": {
        "h": "11",
        "m": "00"
    },
    "horaFin": {
        "h": "13",
        "m": "00"
    }
}]

我想用JavaScript通过"horaInicio"对这个数组进行排序,我寻找了一些类似的排序函数

function predicatBy(prop){
   return function(a,b){
      if( a[prop] > b[prop]){
          return 1;
      }else if( a[prop] < b[prop] ){
          return -1;
      }
      return 0;
   }
}

这对"title"属性有效,但对horaInicio和horaFin都无效。

一些解决方案?

您可以通过直接访问属性对其进行排序。

var array = [{ "titulo": "Materia", "horaInicio": { "h": "08", "m": "00" }, "horaFin": { "h": "10", "m": "00" } }, { "titulo": "Materia2", "horaInicio": { "h": "7", "m": "00" }, "horaFin": { "h": "11", "m": "00" } }, { "titulo": "Materia3", "horaInicio": { "h": "11", "m": "00" }, "horaFin": { "h": "13", "m": "00" } }];
array.sort(function (a, b) {
    return a.horaInicio.h - b.horaInicio.h || a.horaInicio.m - b.horaInicio.m
});
document.write('<pre>' + JSON.stringify(array, 0, 4) + '</pre>');

将"horaInicio"answers"horaFin"作为时间戳,而不是分隔的小时和分钟字符串,将帮助您轻松订购,然后您可以将时间格式化为更易于阅读的格式,以获得最终输出

//可能包含打字错误

data=JSON.parse(响应);

对于(i=0;i

for(j=i+1;j<data.length;j++)
{
    if(data[i].horalinicio.h==data[j].horalinicio.h)
    {
         if(data[i].horalinicio.m>data[j].horalinicio.m)
         {
          var t=data[j];
          data[j]=data[i];
          data[i]=t;
         }
    }
    else if(data[i].horalinicio.h>data[j].horalinicio.h)
    {    
         var t=data[j];
          data[j]=data[i];
          data[i]=t;

    }
}

}

//生成json字符串

sort_json=json.stringify(数据);

只需创建一个比较器函数来对开始时间小时和分钟进行排序。

var arr = [{
  "titulo":     "Materia",
  "horaInicio": {"h":"08", "m":"00"},
  "horaFin":    {"h":"10", "m":"00"}
}, {
  "titulo":     "Materia2",
  "horaInicio": {"h":"7",  "m":"00"},
  "horaFin":    {"h":"11", "m":"00"}
}, {
  "titulo":     "Materia3",
  "horaInicio": {"h":"11", "m":"00"},
  "horaFin":    {"h":"13", "m":"00"}
}];
function sortByStartTime(a, b) {
  if (b == null) return -1;
  if (a == null) return 1;
  
  var horaInicioA = a['horaInicio'];
  var horaInicioB = b['horaInicio'];
  
  if (horaInicioB == null) return -1;
  if (horaInicioA == null) return 1;
  var horaDiff = parseInt(horaInicioA['h'], 10) - parseInt(horaInicioB['h'], 10);
  
  if (horaDiff != 0) {
    return horaDiff;
  }
  return parseInt(horaInicioA['m'], 10) - parseInt(horaInicioB['m'], 10);
};
arr.sort(sortByStartTime); // Sort with our custom compartor.
document.body.innerHTML = '<pre>' + JSON.stringify(arr, null, 4) + '</pre>';

您还可以将时间转换为Date对象并对其进行排序。该分类器将接受时间抓取器功能(timeGrabberFn),该功能将返回可在内部读取的对象。这使得任何对象数组的排序时间都更加通用。

var arr = [{
  "titulo":     "Materia",
  "horaInicio": {"h":"08", "m":"00"},
  "horaFin":    {"h":"10", "m":"00"}
}, {
  "titulo":     "Materia2",
  "horaInicio": {"h":"7",  "m":"00"},
  "horaFin":    {"h":"11", "m":"00"}
}, {
  "titulo":     "Materia3",
  "horaInicio": {"h":"11", "m":"00"},
  "horaFin":    {"h":"13", "m":"00"}
}];
function timeSorter(timeGrabberFn) {
  function timeToDateTime(time) {
    return new Date(1970, 0, 1, parseInt(time.hour, 10), parseInt(time.minute, 10), 0, 0);
  }
  function grabDateTime(time) {
    return timeToDateTime(timeGrabberFn(time));
  }
  return function(a, b) {
    return grabDateTime(a) - grabDateTime(b);
  };
}
arr.sort(timeSorter(function(item) {
  return {
    hour   : item.horaInicio.h,
    minute : item.horaInicio.m
  };
}));
document.body.innerHTML = '<pre>' + JSON.stringify(arr, null, 4) + '</pre>';