我有以下问题: 我有这个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。
某些解决方案?答案 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);