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

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

var foo = [];

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

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

Ответы [ 56 ]

7 голосов
/ 09 апреля 2017

Просто еще одна ES6 версия.

Используя Array.from второй необязательный аргумент:

Array.from (arrayLike [, mapFn [, thisArg]])

Мы можем построить нумерованный массив из пустых Array(10) позиций:

Array.from(Array(10), (_, i) => i)

var arr = Array.from(Array(10), (_, i) => i);
document.write(arr);
6 голосов
/ 21 июня 2012

Я искал функциональное решение и получилось:

function numbers(min, max) {
  return Array(max-min+2).join().split(',').map(function(e, i) { return min+i; });
}

console.log(numbers(1, 9));

Примечание: join().split(',') преобразует разреженный массив в непрерывный.

6 голосов
/ 09 марта 2019

Вы можете использовать заливку массива и карту из Es6;так же, как некоторые люди предложили в ответах на этот вопрос.Ниже приведено несколько примеров:

Example-One: Array(10).fill(0).map((e,i)=>i+1)

Result-One: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Example-Two: Array(100/10).fill(0).map((e,i)=>(i*10)+10)

Result-Two:[10, 20, 30, 40, 50, 60, 70, 80, 90, 100]

Я предпочитаю это, потому что нахожу это простым и простым.

6 голосов
/ 18 октября 2014

Я не видел никакого решения, основанного на рекурсивных функциях (и никогда сам не писал рекурсивные функции), так что вот моя попытка.

Обратите внимание, что array.push (что-то) возвращает новую длину массива:

(a=[]).push(a.push(a.push(0))) //  a = [0, 1, 2]

И с рекурсивной функцией:

var a = (function f(s,e,a,n){return ((n?n:n=s)>e)?a:f(s,e,a?a:a=[],a.push(n)+s)})(start,end) // e.g., start = 1, end = 5

РЕДАКТИРОВАТЬ: два других решения

var a = Object.keys(new Int8Array(6)).map(Number).slice(1)

и

var a = []
var i=setInterval(function(){a.length===5?clearInterval(i):a.push(a.length+1)}) 
6 голосов
/ 24 ноября 2013

Импровизация на вышесказанном:

var range = function (n) {
  return Array(n).join().split(',').map(function(e, i) { return i; });
}  

можно получить следующие опции:

1) Array.init для значения v

var arrayInitTo = function (n,v) {
  return Array(n).join().split(',').map(function() { return v; });
}; 

2) получить обратный диапазон:

var rangeRev = function (n) {
  return Array(n).join().split(',').map(function() { return n--; });
};
4 голосов
/ 23 июля 2017

Я нашел эту старую ветку, потому что сам задавался вопросом о том же самом, но я думаю, что ни один из ответов здесь не был проще, чем ваш оригинальный пример, как прокомментировал Кокодоко, хаха!

Я сам использовал этот метод:

var foo = [];
while (foo.length < N)
    foo.push( foo.length + 1 );

Что, по крайней мере, немного быстрее печатать, чем обычный цикл for, и, мы надеемся, не подвержено ошибкам (хотя это может быть дороже в вычислительном отношении).

Может даже сделать что-то вроде:

var foo= [];
while (foo.length < N)
    foo.push( foo.length%4 + 1 );

для заполнения массива 1-4 раза в последовательном порядке. Или используйте этот метод, чтобы заполнить массив одним элементом, хотя я думаю, что в этом случае может быть быстрее использовать Array(N).fill(x).

3 голосов
/ 04 ноября 2016

Попробуйте добавить итератор к прототипу Number.

Number.prototype[Symbol.iterator] = function *(){
  let i = 0;
  while(i < this) yield i++;
  return;
}

Теперь, когда числа итеративны, просто передайте число в Array.from

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

или где-либо еще требуется итерация, например для ... циклов .

for(const number of 10) console.log(number);//logs 0 through 9 sequentially

Это несколько запутанно, но также круто.

3 голосов
/ 27 октября 2015

Давайте поделимся моим: p

var i = 10; 
Math.pow(2, i).toString(2).split('').map((i,j) => j)
2 голосов
/ 02 октября 2014

Все это слишком сложно.Просто сделайте:

function count(num) {
  var arr = [];
  var i = 0;

  while (num--) {
    arr.push(i++);
  }

  return arr;
}

console.log(count(9))
//=> [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ]

Или введите диапазон от a до b

function range(a, b) {
  var arr = [];

  while (a < b + 1) {
    arr.push(a++);
  }

  return arr;
}

console.log(range(4, 9))
//=> [ 4, 5, 6, 7, 8, 9 ]
2 голосов
/ 11 ноября 2015

Вопрос был о альтернативах этой технике, но я хотел бы поделиться более быстрым способом сделать это.Он почти идентичен коду в вопросе, но выделяет память вместо использования push:

function range(n) {
    let a = Array(n);
    for (let i = 0; i < n; a[i++] = i);
    return a;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...