24

Как создать массив, содержащий числа от 1 до N?

27

Я ищу альтернативы приведённому ниже коду для создания массива в JavaScript, содержащего числа от 1 до N, где N известно только во время выполнения программы.

var foo = [];

for (var i = 1; i <= N; i++) {
   foo.push(i);
}

Мне кажется, что есть способ сделать это без использования цикла.

4 ответ(ов)

4

Массивы сами по себе управляют своими размерами. При их обходе индексы могут храниться в памяти и использоваться в данный момент. Если необходимо узнать случайный индекс, можно воспользоваться методом indexOf.

Тем не менее, для ваших нужд вы можете просто объявить массив определенного размера:

var foo = new Array(N); // где N - положительное целое число

/* это создаст массив размера N, в первую очередь для выделения памяти,
   но не наполнит его никакими определенными значениями

   foo.length                                // размер массива
   foo[ Math.floor(foo.length/2) ] = 'value' // помещает значение в середину массива
*/

ES6

Spread

Используя оператор распространения (...) и метод keys, вы можете создать временный массив размера N для получения индексов, а затем новый массив, который можно присвоить вашей переменной:

var foo = [ ...Array(N).keys() ];

Fill/Map

Сначала вы можете создать массив нужного размера, заполнить его неопределенными значениями, а затем создать новый массив с помощью map, который установит каждому элементу его индекс.

var foo = Array(N).fill().map((v, i) => i);

Array.from

С помощью этого метода вы можете сразу инициализировать массив длиной N и заполнить его в один проход.

Array.from({ length: N }, (v, i) => i)

В ответ на комментарии и возможную путаницу, если вы хотите получить значения от 1 до N в приведенных примерах, есть несколько вариантов:

  1. Если индекс доступен, вы можете просто увеличить его на единицу (например, ++i).

  2. В случаях, когда индекс не используется — и возможно, более эффективный способ — создать массив, но сделать так, чтобы N представляло N+1, а затем удалить первый элемент.

    Например, если вы хотите получить 100 чисел:

    let arr; (arr = [ ...Array(101).keys() ]).shift()
    
2

В ES6 вы можете использовать следующий подход для создания массива из чисел от 1 до N:

console.log(
  Array(N).fill().map((e, i) => i + 1)
);

Здесь мы создаем массив фиксированного размера N, заполняем его (можно использовать любой элемент для заполнения, например, 0), а затем с помощью метода map преобразуем его, возвращая индекс каждого элемента, увеличенный на 1.

Эта конструкция позволяет легко получить последовательность чисел от 1 до N. В вашем примере вы упомянули Array(45), но так как вопрос был обновлен, лучше использовать Array(N), чтобы это было более универсально.

Если хотите увидеть это в действии, вот пример:

console.log(
  Array(45).fill(0).map((e, i) => i + 1)
);

Это создаст и выведет массив чисел от 1 до 45.

0

В ответ на ваш вопрос о создании функции, генерирующей диапазон чисел в JavaScript, вы можете использовать следующий код:

function range(start, end) {
    var foo = [];
    for (var i = start; i <= end; i++) {
        foo.push(i);
    }
    return foo;
}

Эту функцию можно вызвать следующим образом:

var foo = range(1, 5);

К сожалению, в JavaScript нет встроенного способа для создания таких диапазонов, но это вполне валидная утилита, если вам нужно использовать её несколько раз.

Редактирование: На мой взгляд, следующая версия функции диапазона является более удобной. Возможно, я biased из-за влияния LINQ, но она, на мой взгляд, более универсальна для разных случаев использования:

function range(start, count) {
    if(arguments.length == 1) {
        count = start;
        start = 0;
    }

    var foo = [];
    for (var i = 0; i < count; i++) {
        foo.push(start + i);
    }
    return foo;
}

Такой подход позволяет создавать диапазоны более гибко, например, вы можете вызвать её, передав только одно значение, и она автоматически начнет с нуля.

0

Просто, это сработало для меня:

[...Array(5)].map(...)

Другими словами, я использовал оператор расширения для создания массива из 5 элементов и затем применил метод map(...).

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь