【问题标题】:Sort array based of startTime & endTime根据 startTime 和 endTime 对数组进行排序
【发布时间】:2019-08-25 04:45:34
【问题描述】:

我得到了一个包含 fromTime 和 endTime 的对象数组。我想对它们进行排序,以便在数组中首先获得 16:00-18:00,最后获得 16:00-21:00。我知道如何根据 endDate 进行过滤,但是我需要将 fromDate 考虑在内,有人可以帮助我朝正确的方向前进吗?

"deliverySlots": [
    {
        "deliveryFromTime": "17:00",
        "deliveryToTime": "19:00",
    },
    {
        "deliveryFromTime": "18:00",
        "deliveryToTime": "20:00",
    },
    {
        "deliveryFromTime": "19:00",
        "deliveryToTime": "21:00",
    },
    {
        "deliveryFromTime": "16:00",
        "deliveryToTime": "21:00",
    },
    {
        "deliveryFromTime": "16:00",
        "deliveryToTime": "18:00",
    }
]

function compare(a,b) {
    var time1 = parseFloat(a.deliveryToTime.replace(':','.').replace(/[^\d.-]/g, ''));
    var time2 = parseFloat(b.deliveryToTime.replace(':','.').replace(/[^\d.-]/g, ''));
    if (time1 < time2) return -1;
    if (time1 > time2) return 1;
    return 0;
}   
deliverySlots.sort(compare);

目标:

"deliverySlots": [
    {
        "deliveryFromTime": "16:00",
        "deliveryToTime": "18:00",
    },
    {
        "deliveryFromTime": "17:00",
        "deliveryToTime": "19:00",
    },
    {
        "deliveryFromTime": "18:00",
        "deliveryToTime": "20:00",
    },
    {
        "deliveryFromTime": "19:00",
        "deliveryToTime": "21:00",
    },
    {
        "deliveryFromTime": "16:00",
        "deliveryToTime": "21:00",
    },
]

所以基本上我想优先排序 endDate 和 startDate。 16:00-21:00应该在19:00-21:00之后来

【问题讨论】:

  • 为什么16-21最后而不是,例如19-21?不清楚应该是什么逻辑,能不能说的更准确点?
  • 为什么16:00-21:00 是最后一个?请添加排序结果。
  • 所以基本上我想优先排序 endDate & 然后 startDate。 16:00 - 21:00 应该在 19:00-21:00 之后我已经更新了我的第一篇文章

标签: javascript arrays node.js sorting


【解决方案1】:

创建一个函数,按对象的属性值对对象进行排序,如下所示:

var deliverySlots = [
    {
        "deliveryFromTime": "17:00",
        "deliveryToTime": "19:00",
    },
    {
        "deliveryFromTime": "18:00",
        "deliveryToTime": "20:00",
    },
    {
        "deliveryFromTime": "19:00",
        "deliveryToTime": "21:00",
    },
    {
        "deliveryFromTime": "16:00",
        "deliveryToTime": "21:00",
    },
    {
        "deliveryFromTime": "16:00",
        "deliveryToTime": "18:00",
    }
];


function compare(a,b) {
  if (a.deliveryToTime < b.deliveryToTime || (a.deliveryToTime == b.deliveryToTime && a.deliveryFromTime > b.deliveryFromTime))
    return -1;
  if (a.deliveryToTime > b.deliveryToTime || (a.deliveryToTime == b.deliveryToTime && a.deliveryFromTime < b.deliveryFromTime))
    return 1;
  return 0;
}

deliverySlots.sort(compare);

console.log(deliverySlots);

【讨论】:

  • 所以基本上我想优先排序 endDate & 然后 startDate。 16:00 - 21:00 应该在 19:00-21:00 之后进行
  • 对不起让你困惑了,我自己也困惑了......:P
【解决方案2】:

您可以获取事件的长度,然后按开始和结束时间排序。

const getMin = s => s.split(':').reduce((a, b) => a * 60 + +b);

var deliverySlots = [{ deliveryFromTime: "17:00", deliveryToTime: "19:00" }, { deliveryFromTime: "18:00", deliveryToTime: "20:00" }, { deliveryFromTime: "19:00", deliveryToTime: "21:00" }, { deliveryFromTime: "16:00", deliveryToTime: "21:00" }, { deliveryFromTime: "16:00", deliveryToTime: "18:00" }];

deliverySlots.sort((a, b) => {
    var aa = [a.deliveryFromTime, a.deliveryToTime].map(getMin),
        bb = [b.deliveryFromTime, b.deliveryToTime].map(getMin);

    return (aa[1] - aa[0]) - (bb[1] - bb[0])
        || aa[0] - bb[0]
        || aa[1] - bb[1];
});

console.log(deliverySlots);

【讨论】:

    猜你喜欢
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-08
    相关资源
    最近更新 更多