高效创建并填充具有一定范围内连续数字的数组的方法

5

目前我使用这个JavaScript来创建一个从0到n的包含n个数字的数组:

// javascript populate array 
var n=1000;
var arr=[n];
for (i=n;i>=0;i--) {
arr[i]=i;
console.log(arr[i]);
} 

这是完成任务的快速/正确方式吗?


对于 n=100000,耗时15毫秒。 - Yurij
7个回答

15

你可以使用 Array.from 来实现声明式编程,例如:

arr = Array.from({length: 20}, (e, i)=> i)
console.log(arr)


仅使用循环迭代方法时,n=100000时的速度为25毫秒与15毫秒相比。 - Yurij
你能详细解释一下这是如何工作的吗?我已经阅读了 MDN 的文档,但需要一个 ELI5。{length: 20} 是如何工作的,我该如何查找相关信息? - pmath325
在MDN的描述下,array-like对象是带有length属性和索引元素的对象。如果需要创建一个新的具有length属性的对象(例如-20),则可以使用Array.from方法,该方法会查看length属性并尝试为其在长度(0...19)中的每个索引处对对象进行索引。它得到每个索引处的Undefined值,并将(Value,Index)传递给箭头函数。然后箭头函数返回索引,由Array.from收集。 - Reid Ballard

7

持续时间值从19ms到50ms存在很大的离散度,但这只是一种快速方法。(n=1000000); - Yurij

3
您可以使用函数map,跳过谓词的第一个参数,并获取索引i

let arr = Array(10).fill().map((_, i) => i);
console.log(arr);


短小但慢。~35毫秒 vs 15毫秒 - Yurij

3
如果你所说的"高效"是指"字符最少",我认为这个答案比其他任何回答都更短:
[...Array(10).keys()]

当使用浏览器控制台测试东西时,这些东西非常有用。但请注意,它的速度比当前被接受的答案慢了两倍以上:

Array.from({length:10},(e,i)=>i)

尽管我还没有进行专业测试,但我已经尝试使用两种方法创建了一个包含1e8个元素的数组。在我的小型笔记本上,第一种方法需要约5秒钟,而第二种方法仅需要2秒钟(对于两种方法都存在相当大的可变性),但是使用1e9个元素的数组会导致内存不足。

但对于那些需要经常将这样的内容输入到浏览器控制台的用户来说,记忆和输入的便捷性可能比性能更重要。请注意,如果您将结果立即输入到.map()中,则第一种方法只比第二种方法少一个字符,并且性能比较差,特别是因为第二种方法不需要单独的.map()调用。因此,仅适用于调试或尝试功能,但我认为仍然很有用。


1

我认为最短的方法是 [...Array(10)].map((a,b)=>b)

console.log(
  [...Array(10)].map((a,b)=>b)
)


1

0
稍微优化,使用while循环:
let i = 1000;
const arr = [0];
while (i) {
  arr[i] = i;
  i--;
}

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接