首页 > 解决方案 > 通过改变其形式的一键对数组进行排序

问题描述

我有以下问题。我有一系列活动,我必须按日期排序。问题是“日期”键并不总是相同的。如果是一天的活动,它看起来像:

date: "2019-10-25T00:00:00.000Z"

但如果是两天或更长时间,它看起来像:

date:{dateFrom: "2017-05-13T00:00:00.000Z", dateTo: "2017-05-14T00:00:00.000Z"}

我尝试过正常排序或对两个永远不为空的键进行排序的函数类型。

那么,我怎样才能按日期对这个数组进行排序呢?

activities = [{
        "date": {dateTo:"2019-05-20T00:00:00.000Z", dateFrom: "not important"},
        activity: 5
    },{
        "date": {dateTo:"2019-05-05T00:00:00.000Z", dateFrom: "not important"},
        activity: 2
    },{
        "date": "2019-05-10T00:00:00.000Z",
        activity: 3
    },{
        "date": "2019-05-25T00:00:00.000Z",
        activity: 6
    },{
        "date": "2019-05-01T00:00:00.000Z",
        activity: 1
    },{
        "date": "2019-05-15T00:00:00.000Z",
        activity: 4
}]

标签: javascript

解决方案


一种解决方案是定义一个辅助函数,如getItemDate(),结合常规Array#sort()方法来实现您的要求:

const activities = [{
        "date": {dateTo:"2019-05-20T00:00:00.000Z", dateFrom: "not important"},
        activity: 5
    },{
        "date": {dateTo:"2019-05-05T00:00:00.000Z", dateFrom: "not important"},
        activity: 2
    },{
        "date": "2019-05-10T00:00:00.000Z",
        activity: 3
    },{
        "date": "2019-05-25T00:00:00.000Z",
        activity: 6
    },{
        "date": "2019-05-01T00:00:00.000Z",
        activity: 1
    },{
        "date": "2019-05-15T00:00:00.000Z",
        activity: 4
}];

/* Define helper function that obtains a date timestamp from activities list item. If
date key is an object, item.date.dateTo is used, otherwise item.date is used */
function getItemDate(item) {

  let date = (typeof item.date === 'object') ? item.date.dateTo : item.date;
  
  return Date.parse(date);
}

/* Use helper function to sort items in activities list */
activities.sort((a,b) => getItemDate(a) - getItemDate(b))

console.log(activities)


推荐阅读