Сортировать массив дней в порядке возрастания - PullRequest
5 голосов
/ 27 мая 2019

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

["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm"]

Я хочу использовать javascript для сортировки этого массива, чтобы он был в порядке возрастания.

["Wed 3pm", "Sat 10am", "Sat 4pm", "Sun 10am", "Sun 4pm"]

Кто-нибудь может предложить лучший способ сделать это?

Спасибо

Ответы [ 3 ]

4 голосов
/ 27 мая 2019
  • Вы можете создать объект с именами дней в качестве ключей и значениями, увеличивающимися с 1 до 7.

  • Создайте вспомогательную функцию, которая принимает в качестве входных данных вторую часть строки, т. Е. 3pm,10am.., и добавьте 12, чтобы получить ее pm

  • Также разделите результат на 24, поэтому сначала sort должно произойти по дням.
  • Используйте функцию sort() и для каждого значения добавьте индекс времени (который всегда будет меньше 1) к индексу дня (1,2,3...) и вычтите его для обоих значений.

const arr = ["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm"];


function getTime(str){
  let time = str.slice(0,-2);
  let isAm = str.includes('am');
  return (isAm ? +time : +time + 12)/24
}

function sortTime(arr){
  let days = {
    Mon:1,
    Tue:2,
    Wed:3,
    Thur:4,
    Fri:5,
    Sat:6,
    Sun:7
  }
  return arr.slice().sort((a,b) => {
    let [day1,time1] = a.split(' ');
    let [day2,time2] = b.split(' ');
    return (days[day1] + getTime(time1)) - (days[day2] + getTime(time2)) 
  })
  
}

console.log(sortTime(arr))
4 голосов
/ 27 мая 2019

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

const
    getTime = string => {
        var [day, hour, meridian] = string.match(/^(\D{3}) (\d+)(am|pm)/).slice(1),
            days = { Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6, Sun: 7 };

        return days[day] * 24 + +hour + (meridian === 'pm' && 12) + (hour === '12' && -12);
    };
var array = ["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm", "Sat 12pm", "Sat 12am"];

array.sort((a, b) => getTime(a) - getTime(b));

console.log(array);
2 голосов
/ 27 мая 2019

Вы можете использовать комбинацию map и sort. Здесь я конвертирую время в 24-часовом формате для удобства сравнения чисел.

var array = ["Sun 10am", "Sat 4pm", "Sat 10am", "Wed 3pm", "Sun 4pm"], 
mapping = { Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6, Sun: 7 },

result = array
  .map((time, i) => {
    const hour = parseInt(time.split(" ")[1], 10);
    const hour24 = time.indexOf("am") > -1 ? hour : hour + 12;
    return {
      index: i,
      day: mapping[time.split(" ")[0]],
      hour24
    }
  })
  .sort((a, b) => a.day - b.day || a.hour24 - b.hour24)
  .map(({
    index
  }) => array[index]);

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...