Сортировать массив на основе startTime и endTime - PullRequest
2 голосов
/ 03 апреля 2019

Я получил массив объектов, содержащих 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

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Вы можете получить длину событий, а затем отсортировать по времени начала и окончания.

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);
1 голос
/ 03 апреля 2019

Создайте функцию для сортировки вашего объекта по значениям их свойств, например ниже:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...