按照反向时间顺序排列对象的Javascript排序
问题描述:
我有一个包含作业列表的对象数组,我想按照它们在简历上显示的顺序进行排序。 我想出了下面的解决方案,似乎可以工作,但我想知道是否有更好的方法。按照反向时间顺序排列对象的Javascript排序
我从服务器返回的数据格式如下。
// ms=> monthStart me=>monthEnd etc...
var jobs = [
{
ms: 06,
ys: 2013,
me: 02,
ye: 2015
},
{
ms: 09,
ys: 2013,
me: 02,
ye: 2014
},
{
ms: 08,
ys: 2000,
me: 06,
ye: 2016
},
{
ms: 01,
ys: 2014,
me: 02,
ye: 2017
}
];
我想出了为每个项目添加时间顺序散列值的函数。
var args = {
monthStart: 'ms',
yearStart: 'ys',
monthEnd: 'me',
yearEnd: 'ye'
};
function createItemTimeOrder(item, args) {
var monthStart = item[args.monthStart] || 0,
yearStart = item[args.yearStart] || 0,
monthEnd = item[args.monthEnd] || 0,
yearEnd = item[args.yearEnd] || 0;
// present if end month and end year are empty
(monthEnd && yearEnd) || (monthEnd = 12, yearEnd = 3000);
// weights yearEnd > monthEnd > yearStart > monthStart
item._timeorder =
monthStart + (yearStart * 2) +
((monthEnd + yearEnd) * 2) +
(yearEnd * 4);
}
//add _timeorder proptery
jobs.forEach(function (job) {
createItemTimeOrder(job, args);
});
// sortby timer order in in reverse chronological order
jobs.sort(function (job1, job2) {
return job2._timeorder - job1._timeorder;
});
答
正如PM 77-1建议的,考虑在Date对象中使用内置的Array.prototype.sort。想必你想他们在开始或结束的一个排序:
jobs.sort(function(a, b) {
return new Date(a.ys, a.ms-1) - new Date(b.ys, b.ms-1);
})
+0
看来你似乎想要在其他日期打破关系,所以你可能也想编辑它。 – moreON
为什么不能用[Array.prototype.sort()](https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/Array/sort)与您的自定义'compareFunction'? –