2015-06-22 4 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, рассмотреть возможность использования встроенного 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

Смежные вопросы