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

var foo = [];

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

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


当前回答

“_”.重复(5).拆分(“”).映射((_,i)=>i+1)将产生[1,2,3,4,5]

其他回答

使用ES6标准中的新Array方法和=>函数语法(编写时仅限Firefox)。

通过用未定义的:

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

Array.from将“孔”转换为未定义,因此Array.map按预期工作:

Array.from(Array(5)).map((_, i) => i + 1)
function range(start, end) {
    var foo = [];
    for (var i = start; i <= end; i++) {
        foo.push(i);
    }
    return foo;
}

然后由调用

var foo = range(1, 5);

在Javascript中没有内置的方法来实现这一点,但如果您需要多次执行,则可以创建一个非常有效的实用程序函数。

编辑:在我看来,以下是一个更好的范围函数。也许只是因为我对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;
}

尝试在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

这有点复杂,但也很酷。

//不分配N大小数组(ES6,带有一些流注释)的解决方案:函数*zeroToN(N/*:数字*/)/*:生成器<number,void,empty>*/{对于(设n=0;n<=n;n+=1),得到n;}//通过这一代,您可以拥有您的阵列console.log([…zeroToN(10-1)])//但是让我们定义一个助手迭代器函数函数mapIterator(迭代器,映射){常量arr=[];for(let result=iterater.next()!result.done;result=iterator.next()){arr.push(映射(result.value));}返回arr;}//现在您有了一个map函数,不需要分配0…N-1数组console.log(mapIterator(zeroToN(10-1),n=>n*n));

这个问题有很多复杂的答案,但只有一句简单的话:

[...Array(255).keys()].map(x => x + 1)

此外,虽然上面的内容写起来很短(很整洁),但我认为下面的内容要快一点(最大长度:

127,国际8,

255,Uint8,

32767,国际16,

65535、Uint16、,

2147483647,国际32,

4294967295,Uint32。

(基于最大整数值),这里还有关于类型化数组的更多信息):

(new Uint8Array(255)).map(($,i) => i + 1);

虽然这个解决方案也不太理想,因为它创建了两个数组,并使用了额外的变量声明“$”(不确定使用这个方法有什么方法可以解决这个问题)。我认为以下解决方案是实现这一目标的最快方法:

for(var i = 0, arr = new Uint8Array(255); i < arr.length; i++) arr[i] = i + 1;

在该语句之后的任何时候,您都可以在当前范围中简单地使用变量“arr”;

如果你想用它做一个简单的函数(带有一些基本的验证):

功能范围(最小、最大){min=min&&min.constructor==数字?最小值:0;!(max&&max.constructor==Number&&max>min)&&//布尔语句也可以用于void返回类型,如单行if语句。((最大值=最小值)&(最小值=0))//如果指定了一个“max”参数,那么首先检查它是否是一个数字,以及它是否大于min:如果是,保持不变;如果没有,那么就把它当作一开始没有“max”,“max”变为“min”(默认情况下,min变为0)对于(var i=0,arr=new(最大值<128?Int8阵列:最大值<256?Uint8阵列:最大值<32768?Int16阵列:最大值<65536?Uint16阵列:最大值<2147483648?Int32阵列:最大值<4294967296?Uint32阵列:大堆)(最大值-最小值);i<arr.length;i++)arr[i]=i+min;返回arr;}//如果需要,可以使用数组方法轻松循环range(1,11).forEach(x=>console.log(x));//或者如果你习惯了蟒蛇。。。在“你可以用”for。。。的“如果您需要单个值:对于(i范围(20202025))console.log(i);//或者如果你真的想用“for…”。。在“”中,您可以,但随后您只能访问密钥:对于(范围内的k(25,30))console.log(k);控制台日志(范围(1128).构造器名称,范围(200).构造器名称,范围(400900).结构名称,范围(33333).结构名称,范围(823100000).结构名称,range(10,4)//当“min”参数大于“max”时,它只会认为没有“max”,新的max变为“min”,“min”变为0,就好像“max”从未被写入);


因此,通过上述功能,上述超慢的“简单一行”变成了超快,甚至更短:

range(1,14000);