排序JSON数组对象

时间:2016-04-15 14:06:07

标签: javascript arrays json sorting

我有以下问题: 我有这个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"
    }
}]

我希望通过" horaInicio"对这个数组进行排序。使用JavaScript,我寻找像这样的一种排序函数

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

这适用于&#39; title&#39;属性但不适用于horaInicio horaFin。

某些解决方案?

4 个答案:

答案 0 :(得分:3)

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

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>');

答案 1 :(得分:0)

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

答案 2 :(得分:0)

只需创建一个比较器功能,对开始时间小时和分钟进行排序。

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>';

答案 3 :(得分:0)

//可能包含拼写错误

数据= JSON.parse(响应);

为(I = 0;我

{

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;


    }

}

}

// make json string

sort_json = JSON.stringify(data);