对JSON数组对象进行排序
Sort JSON array object
我有以下问题:我有这个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>';
相关文章:
- 在循环Handlebars之前重新排序对象键
- 将SortedMap从Java转换为Javascript中可读的排序对象
- 模仿`overflow-y:auto;overflow-x:visible `在jQuery UI可排序对象上
- Javascript排序对象日期
- Jquery UI:如何指示可拖动对象成功拖放到可排序对象上
- 删除数组中重复的未排序对象
- Javascript 递归地排序对象和嵌套对象以及数组
- 如何在目标可排序对象接收后获取拖动项的类
- Javascript:排序对象挑战
- 在 JavaScript 中合并多个排序对象数组的最有效方法是什么?
- 如何在角度UI中加载保存的可排序对象
- 任意重新排序和排序对象文字的 JavaScript 数组
- 使用下划线在javascript中重新排序对象
- 排序对象的多维数组与一个可变的深度在Javascript
- 在javascript中,排序对象不会传递给字符串变量
- JavaScript快速排序对象
- 在JavaScript数组中按键值排序对象
- 用布尔值排序对象
- 如何在D3.js中通过JSON文件解析按键排序对象
- Javascript如何按键排序对象,但不破坏原始对象的顺序