Как разрезать массив с оберткой? - PullRequest
1 голос
/ 19 июня 2020

У меня есть этот массив дней:

const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']

Мне нужна функция, которая может захватывать все дни между (включительно) 2 указанными днями. Например:

function getDaysBetween(day1, day2) {
  return days.slice(days.indexOf(day1), days.indexOf(day2) + 1);
}

Это работает:

getDaysBetween('Monday', 'Thursday');
// ['Monday', 'Tuesday', 'Wednesday', 'Thursday']

Но это не так:

getDaysBetween('Saturday', 'Monday');
// []
// should be ['Saturday', 'Sunday', 'Monday']

Он возвращает пустой массив, если индекс первого day больше индекса второго дня.

Как я могу исправить эту функцию, чтобы получить нужные мне результаты?

Ответы [ 3 ]

4 голосов
/ 19 июня 2020

Другой подход с корректировкой конечного индекса.

function getDaysBetween(day1, day2) {
    const
        start = days.indexOf(day1),
        end = days.indexOf(day2) + 1;

    return [...days, ...days].slice(start, end < start ? end + days.length : end);
}

const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];


console.log(getDaysBetween('Monday', 'Thursday')); // ['Monday', 'Tuesday', 'Wednesday', 'Thursday']
console.log(getDaysBetween('Saturday', 'Monday')); // ['Saturday', 'Sunday', 'Monday']
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 19 июня 2020

Краткое решение, основанное на двухнедельной схеме и втором аргументе Array.indexOf.

(Я полностью отредактировал свой первый ответ. Это другой подход.)

const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']


function getDaysBetween(day1, day2) {

  let twoWeeks = [...days, ...days];  
   return twoWeeks.slice(twoWeeks.indexOf(day1), twoWeeks.indexOf(day2, twoWeeks.indexOf(day1)) + 1 );
}


console.log(getDaysBetween('Monday', 'Thursday'));
console.log(getDaysBetween('Saturday', 'Monday'));
1 голос
/ 19 июня 2020

Когда индекс второго дня меньше индекса первого дня, вы можете объединить с первого индекса и далее до второго индекса.

function getDaysBetween(day1, day2) {
  let day1Index = days.indexOf(day1);
  let day2Index = days.indexOf(day2);
  if (day2Index < day1Index) {
    return days.slice(day1Index, days.length).concat(days.slice(0, day2Index + 1));
  } else {
    return days.slice(days.indexOf(day1), days.indexOf(day2) + 1);
  }
}
...