Менять порядок элементов списка исходя из кратности входящего числа 5-ти
Предположим, у меня есть список дней недели:
let days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
И есть диапазон чисел от 1 до 1001.
Как написать код так, чтобы при каждом number % 5 == 0 первый элемент списка попадал в конец.
В функцию при этом должно задаваться только число, диапазон от 1 до 1001 подразумевается уже внутри.
В итоге должно получиться следующее:
При number == 5:
let days = ['Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday']
При number == 10:
let days = ['Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday', 'Monday', 'Tuesday']
и т.д.
Есть такое условие еще: однако из кратных 100 сдвигать лишь кратные 500, например, 700, 800, и 900 - не менять список, 1000 - менять.
Если нужна дополнительная информация, задавайте вопросы.
Спасибо
Ответы (1 шт):
let days = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"];
console.log( bubu( 5) ); // [ "Tuesday", "Wednesday"...
console.log( bubu(10) ); // [ "Wednesday", "Thursday"...
console.log( bubu(15) ); // [ "Thursday", "Friday"...
console.log( bubu(35) ); // [ "Monday", "Tuesday"... (зациклилось)
function bubu(n) {
if (n % 100 == 0 && n % 500 != 0) return days.slice(0);
// Кратно 100, но не кратно 500 — не трогать массив (return прерывает функцию)
let delta = (n / 5 | 0) % days.length;
return [].concat( days.slice(delta), days.slice(0, delta) );
}
code { white-space: nowrap !important; }
let delta = (n / 5 | 0) % days.length;
n / 5 | 0 — равносильно Math.trunc( n / 5 ), а-ля целочисленное деление. Находит, сколько пятерок "поместится" в n. Скажем, для 100 → 20 штук.
Но зачем 20 раз кругами перекладывать элементы, если оно через каждые 7 штук встает на начальную позицию? 20 % 7 → 6 (остаток от деления 20 на 7), значит нужен сдвиг на 6 позиций. Можно разрезать массив на 6-й позиции и приклеить куски в обратном порядке.
* return days.slice(0); — .slice(0) создает новый массив из элементов days. Сделан так вместо return days; потому что не известно, что должны делать с полученным массивом. Будет не приятно, если его случайно пересортируют, перепишут элементы или еще что-то (см. «Мутация массива»).