2015-06-22 85 views
0

我有一个包含作业列表的对象数组,我想按照它们在简历上显示的顺序进行排序。 我想出了下面的解决方案,似乎可以工作,但我想知道是否有更好的方法。按照反向时间顺序排列对象的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; 
}); 
+0

为什么不能用[Array.prototype.sort()](https://developer.mozilla.org/en-US/docs/Web/ JavaScript/Reference/Global_Objects/Array/sort)与您的自定义'compareFunction'? –

回答

1

正如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