@sxivanov
Junior Frontend - разработчик

Работа с массивом JS. Как реализовать обратный ход?

Всем привет! Сижу над заданием из учебника "Выразительный JS".
Кратко, задание состоит в том, что бы сделать массив из последовательности чисел, ограниченых задаными start и end.
Аргумент step - шаг массива, если он есть, то каждое последующее значение массива увеличивается на step, если шаг не задан, то на единицу. Мне стало интересно посмотреть, как будет работать, когда начальное больше конечного значения и при отсуствующем шаге последний будет задан как -1.
В моем коде четвертое условие, когда конечное значение больше начального и шаг не задан, - не отрабатывает. Хотя третье условие работает как нужно.
function range(start, end, step) {
    var arr = [];
    if (step > 0) {
        for (var n = start; n <= end; n += step)
            arr.push(n);
    } else if (step < 0) {
        for (var n = start; n >= end; n += step)
            arr.push(n)
    } else if (step == undefined || step == null || step == 0 && start < end) {
        for (var n = start; n <= end; n++)
            arr.push(n);
    } else if (step == undefined || step == null || step == 0 && start > end) {
        for (var n = start; n >= end; n--)
            arr.push(n);
    }
    return arr;
};
console.log(range(10, 1));
  • Вопрос задан
  • 85 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Вы не учли приоритеты операций при вычислении условий.
Ваше третье условие выглядит как
(step == undefined || step == null || (step == 0 && start < end))
Соответственно, при вычислении получаете true || true || (false && false), что даёт true и третье условие срабатывает.
Укажите явно приоритет операций.
Современный вариант решения
const range = (start, end, step = 1) => {
  if (step === 0 || isNaN(Number(step))) {
    throw new Exception('Неверное значение step');
  }
  if (start < end && step < 0 || start > end && step > 0) {
    step = -step;
  }
  const n = Math.floor((end - start) / step) + 1;
  return Array(n).fill(1).map((v, i) => start + step * i);
}

console.log(range(10, 1));
// Array(10) [ 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 ]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы