好吧,我有一个带有随机值的数组对象,例如。
var arr = [
{ id:1001, date:"20-02-2014", Name: 'demo1' },
{ id:1004, date:"13-02-2014", Name: 'demo0' },
{ id:1000, date:"10-02-2014", Name: 'demo14' },
{ id:1004, date:"16-02-2014", Name: 'demo10' },
{ id:1006, date:"22-02-2014", Name: 'demo111' },
{ id:1003, date:"28-02-2014", Name: 'demo16' },
{ id:1000, date:"28-01-2014", Name: 'demo12' },
{ id:1004, date:"28-01-2014", Name: 'demo01' },
{ id:1000, date:"08-01-2014", Name: 'demo41' },
{ id:1006, date:"08-01-2014", Name: 'demo91' }
]
我想先按键id
,然后按键对这个数组进行排序date
,
输出:
sorted_arr = [
{"id":1000,"date":"08-01-2014","Name":"demo41"}, //group1
{"id":1000,"date":"28-01-2014","Name":"demo12"}, //group1
{"id":1000,"date":"10-02-2014","Name":"demo14"}, //group1
{"id":1001,"date":"20-02-2014","Name":"demo1"}, //group2
{"id":1003,"date":"28-02-2014","Name":"demo16"}, //group3
{"id":1004,"date":"28-01-2014","Name":"demo01"}, //group4
{"id":1004,"date":"13-02-2014","Name":"demo0"}, //group4
{"id":1004,"date":"16-02-2014","Name":"demo10"}, //group4
{"id":1006,"date":"08-01-2014","Name":"demo91"} //group5
{"id":1006,"date":"22-02-2014","Name":"demo111"} //group5
]
我尝试了一些通用代码进行排序,
// generic comparison function
cmp = function(x, y){
return x > y ? 1 : x < y ? -1 : 0;
};
arr.sort(function(a, b){
return cmp(
[cmp(a.id, b.id), cmp(a.date, b.date)],
[cmp(b.id, a.id), cmp(b.date, a.date)]
);
});
我提到几个示例SO实施例,但没有得到预期的输出。请建议我最好的方法来做到这一点。
无需创建Date
对象,只需将日期字符串重新排序为可排序的字符串,例如
本示例假定您的日期格式相同,DD-MM-YYYY
并YYYYMMDD
为日期排序创建日期。
Java脚本
var arr = [
{ id:1001, date:"20-02-2014", Name: 'demo1' },
{ id:1004, date:"13-02-2014", Name: 'demo0' },
{ id:1000, date:"10-02-2014", Name: 'demo14' },
{ id:1004, date:"16-02-2014", Name: 'demo10' },
{ id:1006, date:"22-02-2014", Name: 'demo111' },
{ id:1003, date:"28-02-2014", Name: 'demo16' },
{ id:1000, date:"28-01-2014", Name: 'demo12' },
{ id:1004, date:"28-01-2014", Name: 'demo01' },
{ id:1000, date:"08-01-2014", Name: 'demo41' },
{ id:1006, date:"08-01-2014", Name: 'demo91' }
];
var sorted = arr.sort(function (a, b) {
return a.id - b.id || a.date.split('-').reverse().join('') - b.date.split('-').reverse().join('');
});
sorted.forEach(function (element) {
console.log(JSON.stringify(element));
});
输出量
{“ id”:1000,“ date”:“ 08-01-2014”,“ Name”:“ demo41”} {“ id”:1000,“ date”:“ 28-01-2014”,“ Name”:“ demo12”} {“ id”:1000,“ date”:“ 10-02-2014”,“ Name”:“ demo14”} {“ id”:1001,“日期”:“ 20-02-2014”,“名称”:“ demo1”} {“ id”:1003,“ date”:“ 28-02-2014”,“ Name”:“ demo16”} {“ id”:1004,“ date”:“ 28-01-2014”,“ Name”:“ demo01”} {“ id”:1004,“ date”:“ 13-02-2014”,“ Name”:“ demo0”} {“ id”:1004,“ date”:“ 16-02-2014”,“ Name”:“ demo10”} {“ id”:1006,“ date”:“ 08-01-2014”,“ Name”:“ demo91”} {“ id”:1006,“ date”:“ 22-02-2014”,“ Name”:“ demo111”}
如果担心混合日期格式(如@xdazz所述),则可以通过自己检查填充来改善此格式。当按日期排序时,以下将创建格式“ YYYYYYMMDD”。在此示例中,不需要额外的年份填充,因为我采用的是数值的数字差异,但是如果您选择比较字符串,那么这很重要。
function pad(s, n) {
var v = '',
i;
for(i = 0; i < n - s.length; i += 1) {
v += '0';
}
return v + s;
}
var sorted = arr.sort(function (a, b) {
var idDiff = a.id - b.id;
if (idDiff) {
return idDiff;
}
var ordA = a.date.split('-').reverse(),
ordB = b.date.split('-').reverse();
ordA[0] = pad(ordA[0], 6);
ordA[1] = pad(ordA[1], 2);
ordA[2] = pad(ordA[2], 2);
ordA = ordA.join('');
ordB[0] = pad(ordB[0], 6);
ordB[1] = pad(ordB[1], 2);
ordB[2] = pad(ordB[2], 2);
ordB = ordB.join('');
return ordA - ordB;
});
如果您真的想使用Date
对象,我建议以下内容。
var sorted = arr.sort(function (a, b) {
var idDiff = a.id - b.id;
if (idDiff) {
return idDiff;
}
var ordA = a.date.split('-').reverse(),
ordB = b.date.split('-').reverse();
ordA[1] -= 1;
ordB[1] -= 1;
return new Date(Date.UTC.apply(undefined, ordA)).valueOf() - new Date(Date.UTC.apply(undefined, ordB)).valueOf();
});
sorted.forEach(function (element) {
console.log(JSON.stringify(element));
});
注意:这些示例不处理负年份的日期,同样,您将需要进行进一步的修改。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句