我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。

var foo = [];

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

对我来说,我觉得应该有一种不用循环的方法。


当前回答

我在寻找一个功能性的解决方案,最终得到了:

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(',')将稀疏数组转换为连续数组。

其他回答

所有这些都太复杂了。只要做到:

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 ]

基于高票答案和高票评论。

const range = (from, to) => [...Array(to + 1).keys()].slice(from);

// usage
let test = [];
test = range(5, 10);
console.log(test); // output: [ 5, 6, 7, 8, 9, 10 ]

试试这个

const foo = numberOfItems=> [...Array(numberOfItems).keys()].map(i => i+1);

试试看:

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

如果您正在使用CoffeeScript,可以通过执行以下操作创建范围:

var foo = [1..5]; 

否则,如果您使用的是普通JavaScript,那么如果要将数组初始化为可变长度,则必须使用循环。

对以上内容进行改进:

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--; });
};