Avatar ·

Как создать массив чисел от 1 до N в JavaScript? (простой способ)

Всем привет! Я только начал изучать JavaScript и столкнулся с такой задачей: мне нужно создать массив, который содержит числа от 1 до N. Например, если N = 5, то массив должен быть [1, 2, 3, 4, 5]. Я попробовал сделать это в лоб — через цикл for: ```javascript let arr = []; for (let i = 1; i <= N; i++) { arr.push(i); } ``` Это работает, но мне кажется, что есть более элегантный способ. На других языках (например, Python) есть встроенная функция range(), а в JavaScript я такого не нашел. Пробовал использовать метод Array.from() и new Array(N), но получается что-то странное: ```javascript // Попытка 1 let arr1 = new Array(5); // [empty × 5] // Попытка 2 let arr2 = Array.from({length: 5}, (v, i) => i); // [0, 1, 2, 3, 4] — но начинается с нуля ``` Как правильно заполнить массив числами от 1 до N, не используя громоздкие конструкции? Хочется короткое и понятное решение. Заранее спасибо! <<>>

Лучший способ: Array.from() с map-функцией

Самый популярный и элегантный способ в современном JavaScript — использовать Array.from() с функцией отображения. Чтобы получить массив от 1 до N, а не от 0 до N-1, просто добавьте +1 к индексу:

const N = 5;
const arr = Array.from({ length: N }, (_, i) => i + 1);
console.log(arr); // [1, 2, 3, 4, 5]

Здесь { length: N } — это псевдомассив (объект с длиной), а второй аргумент — функция, которая вызывается для каждого индекса. Параметр _ (или v) — это значение элемента (оно не нужно), а i — индекс (0, 1, 2, ...). Мы возвращаем i + 1.

Альтернативный классический способ: spread-оператор + keys()

Если вы не любите Array.from, можно использовать комбинацию Array(), keys() и spread-оператора:

const N = 5;
const arr = [...Array(N).keys()].map(i => i + 1);
console.log(arr); // [1, 2, 3, 4, 5]

Пошагово:

  • Array(N) — создаёт массив из N пустых элементов.
  • .keys() — возвращает итератор индексов (0, 1, ..., N-1).
  • [...итератор] — превращает итератор в массив чисел [0, 1, 2, 3, 4].
  • .map(i => i + 1) — сдвигает на 1.

Ещё один вариант: Array.fill() + map()

const N = 5;
const arr = Array(N).fill().map((_, i) => i + 1);
console.log(arr); // [1, 2, 3, 4, 5]

Метод fill() нужен, чтобы превратить "дырявый" массив в нормальный, иначе map() не пройдётся по пустым элементам.

Сравнение производительности

Для массивов до 100 000 элементов разница незаметна. Для больших массивов (миллионы элементов) Array.from() работает быстрее, чем Array(N).fill().map(), но в реальных проектах редко нужны такие объёмы.

Важный совет для новичков

Не забывайте, что все эти методы создают новый массив. Если N очень большой, это может занять память. Для генерации последовательности "на лету" (без хранения всего массива) используйте генераторы:

function* range(start, end) {
    for (let i = start; i <= end; i++) {
        yield i;
    }
}
const arr = [...range(1, 5)]; // [1, 2, 3, 4, 5]

Но для повседневных задач Array.from() — самый простой и читаемый вариант.

<<>>

Альтернативный ответ: функция-помощник range()

Если вы часто создаёте массивы с числами, удобно написать свою маленькую утилиту — функцию range(), как в Python:

function range(start, end, step = 1) {
    const arr = [];
    if (step > 0) {
        for (let i = start; i <= end; i += step) arr.push(i);
    } else {
        for (let i = start; i >= end; i += step) arr.push(i);
    }
    return arr;
}

// Использование:
console.log(range(1, 5));      // [1, 2, 3, 4, 5]
console.log(range(1, 10, 2));  // [1, 3, 5, 7, 9]
console.log(range(5, 1, -1));  // [5, 4, 3, 2, 1]

Этот подход более гибкий: вы можете задать шаг и направление. Для простого случая "от 1 до N" можно сделать короткую версию:

const rangeToN = (n) => Array.from({length: n}, (_, i) => i + 1);
console.log(rangeToN(5)); // [1, 2, 3, 4, 5]

Но имейте в виду: встроенные методы работают быстрее, чем ручной цикл с push(). Для массивов больше 10 000 элементов используйте Array.from().