2015-06-22 205 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