Как создать массив, содержащий числа от 1 до N?
Я ищу альтернативы приведённому ниже коду для создания массива в JavaScript, содержащего числа от 1 до N, где N известно только во время выполнения программы.
var foo = [];
for (var i = 1; i <= N; i++) {
foo.push(i);
}
Мне кажется, что есть способ сделать это без использования цикла.
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 в приведенных примерах, есть несколько вариантов:
Если индекс доступен, вы можете просто увеличить его на единицу (например,
++i
).В случаях, когда индекс не используется — и возможно, более эффективный способ — создать массив, но сделать так, чтобы N представляло N+1, а затем удалить первый элемент.
Например, если вы хотите получить 100 чисел:
let arr; (arr = [ ...Array(101).keys() ]).shift()
В 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.
В ответ на ваш вопрос о создании функции, генерирующей диапазон чисел в 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;
}
Такой подход позволяет создавать диапазоны более гибко, например, вы можете вызвать её, передав только одно значение, и она автоматически начнет с нуля.
Просто, это сработало для меня:
[...Array(5)].map(...)
Другими словами, я использовал оператор расширения для создания массива из 5 элементов и затем применил метод map(...)
.
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как очистить массив в JavaScript?
Как удалить все дубликаты из массива объектов?
Выбор последнего элемента в массиве JavaScript