Javascript按时间倒序对对象数组进行排序

标签 javascript arrays sorting

我有一个包含工作列表的对象数组,我想按相反的时间顺序对它们进行排序,例如它们会出现在简历上。 我提出了以下“似乎”有效的解决方案,但我想知道是否有更好的方法。

我从服务器返回的数据格式如下。

// 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 所建议的,考虑使用内置的 Array.prototype.sort与日期对象。大概您想在开始或结束之一对它们进行排序:

jobs.sort(function(a, b) {
  return new Date(a.ys, a.ms-1) - new Date(b.ys, b.ms-1);
})

关于Javascript按时间倒序对对象数组进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30971981/

相关文章:

java - 如何将方法输出传递到数组元素中?

javascript - 根据属性值(int)对对象数组进行排序

javascript - 如何在 Javascript 中合并和过滤两个对象数组?

javascript - 在 Ace 编辑器中禁用水平分割

javascript - 如何调用返回 block 中写入键值对的函数?

python-3.x - 按频率最高的键对字典进行排序

c - 结构体的合并排序

javascript - 使用 Bacon.js 进行随机数流

arrays - 将数组传递到 block 中

java - 如何在这个问题中正确地乘以 2 个矩阵?