我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。
var foo = [];
for (var i = 1; i <= N; i++) {
foo.push(i);
}
对我来说,我觉得应该有一种不用循环的方法。
我正在寻找以下方法的任何替代方法,以创建包含1到N的JavaScript数组,其中N仅在运行时已知。
var foo = [];
for (var i = 1; i <= N; i++) {
foo.push(i);
}
对我来说,我觉得应该有一种不用循环的方法。
当前回答
使用非常流行的Undercore_.range方法
// _.range([start], stop, [step])
_.range(10); // => [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
_.range(1, 11); // => [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
_.range(0, 30, 5); // => [0, 5, 10, 15, 20, 25]
_.range(0, -10, -1); // => [0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
_.range(0); // => []
其他回答
Array.from({ length: (stop - start) / step + 1}, (_, i) => start + (i * step));
资料来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/from
这个问题有很多复杂的答案,但只有一句简单的话:
[...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);
使用递归的ES6解决方案。不同于所有其他解决方案
const range = (n, A = []) => (n === 1) ? [n, ...A] : range(n - 1, [n, ...A]);
console.log(range(5));
简单量程发生器:
const min = 2000;
const max = 2022;
const range = Array.from({ length: max - min + 1 }, (v, k) => k + min);
console.log('range', range);
//不分配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));