Как создать массив, содержащий 1 ... N - PullRequest
849 голосов
/ 19 сентября 2010

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

var foo = [];

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

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

Ответы [ 56 ]

13 голосов
/ 11 ноября 2014

Использование новых методов Array и => синтаксиса функций из стандарта ES6 (только Firefox на момент написания).

Заполняя отверстия с помощью undefined:

Array(N).fill().map((_, i) => i + 1);

Array.from превращает «дыры» в undefined, поэтому Array.map работает как положено:

Array.from(Array(5)).map((_, i) => i + 1)
9 голосов
/ 25 апреля 2016

Похоже, что единственная разновидность, которой нет в этом довольно полном списке ответов, - это модель с генератором; чтобы исправить это:

const gen = N => [...(function*(){let i=0;while(i<N)yield i++})()]

, который можно использовать таким образом:

gen(4) // [0,1,2,3]

Самое приятное в этом то, что вам не нужно просто увеличивать ... Чтобы черпать вдохновение из ответа @ igor-shubin, вы можете очень легко создать массив случайных чисел:

const gen = N => [...(function*(){let i=0;
  while(i++<N) yield Math.random()
})()]

И вместо чего-то длинного эксплуатационно дорого, как:

const slow = N => new Array(N).join().split(',').map((e,i)=>i*5)
// [0,5,10,15,...]

вы могли бы вместо этого сделать:

const fast = N => [...(function*(){let i=0;while(i++<N)yield i*5})()]
9 голосов
/ 22 января 2015

Немного проще, чем строковый вариант:

// create range by N
Array(N).join(0).split(0);

// create a range starting with 0 as the value
Array(7).join(0).split(0).map((v, i) => i + 1) // [1, 2, 3, 4, 5, 6, 7]

Обновление (04.01.2008): Обновлено для точного ответа на вопрос ОП. Спасибо @lessless за это!

8 голосов
/ 29 мая 2017

Итерируемая версия с использованием генератора , которая не изменяет Number.prototype.

function sequence(max, step = 1) {
  return {
    [Symbol.iterator]: function* () {
      for (let i = 1; i <= max; i += step) yield i
    }
  }
}

console.log([...sequence(10)])
7 голосов
/ 10 февраля 2016

Использование ES6

const generateArray = n => [...Array(n)].map((_, index) => index + 1);
7 голосов
/ 10 февраля 2016

Object.keys(Array.apply(0, Array(3))).map(Number)

Возвращает [0, 1, 2]. Очень похоже на превосходный ответ Игоря Шубина , но с немного меньшим количеством хитрости (и на один символ длиннее).

Пояснение:

  • Array(3) // [undefined × 3] Создать массив длиной n = 3. К сожалению, этот массив почти бесполезен для нас, поэтому мы должны…
  • Array.apply(0,Array(3)) // [undefined, undefined, undefined] сделать массив повторяемым. Примечание: ноль более распространен, так как первый аргумент применяется, но короче 0.
  • Object.keys(Array.apply(0,Array(3))) // ['0', '1', '2'] затем получить ключи массива (работает, потому что массивы являются типом, массив - это объект с индексами для ключей.
  • Object.keys(Array.apply(0,Array(3))).map(Number) // [0, 1, 2] и отображение ключей, преобразование строк в числа.
7 голосов
/ 14 сентября 2013

Следующая функция возвращает массив, заполненный числами:

var createArrayOfNumbers = function (n) {
    return Array.apply(null, new Array(n)).map(function (empty, index) {
        return index;
    });
};

Обратите внимание, что массив, созданный с помощью конструктора массива, состоит из отверстий, поэтому его нельзя обойти с помощью функций массива, таких как map. Следовательно, используя функцию Array.apply.

7 голосов
/ 17 ноября 2015
Array(8).fill(0).map(Number.call, Number)

Кража Igors Number.call трюк, но с использованием fill(), чтобы немного сократить. Работает только с ES6 и выше.

7 голосов
/ 19 сентября 2010

Попробуйте это:

var foo = [1, 2, 3, 4, 5];

Если вы используете CoffeeScript , вы можете создать диапазон, выполнив:

var foo = [1..5]; 

В противном случае, если вы используете vanilla JavaScript, вам придется использовать цикл, если вы хотите инициализировать массив до переменной длины.

7 голосов
/ 20 сентября 2016

Вы можете использовать генератор функций или выражение функции *. Вот [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/function] и ссылка на ссылку генератора функций на [https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function].

let a = 1, b = 10;

function* range(a, b) { for (var i = a; i <= b; ++i) yield i; }

Array.from(range(a, b)); // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

[...range(a, b)] // [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...