如何使用for in循环动态填充数组

jea*_*_re 4 javascript arrays for-in-loop

要返回set一个序列为1到500之间的随机数的数组,我尝试重构一个标准for循环for(var i = 0; i< 50; i++),但是当我尝试使用for in循环重构时,它没有.我的猜测是,有一些关于array.length财产的东西,它的使用,我搞砸了.

TL; DR为什么这会返回50个未定义元素的数组,而不是50个随机整数的数组?有没有办法让这种方法有效?

var set = [];
set.length = 50;

for(var i in set){
    set[i] = Math.floor((Math.random() * 500) + 1);
}

console.log(set);
Run Code Online (Sandbox Code Playgroud)

类似的问题:有帮助,但不是我想要的

更新

我怀疑我遗漏的一点是设置set.length没有向数组添加元素,它只创建一个稀疏数组(一个带有间隙的数组).在我的情况下,你不能使用for in,因为没有任何东西数组遍历.我要么必须使用虚拟内容(即空字符串)填充数组,或者更逻辑地将我尝试使用.length属性实现的范围部分分离为单独的range变量.

工作版

var set = [], range = 50;

for(var i = 0; i < range; i++){
    set[i]=Math.floor((Math.random() * 500) + 1);
}

console.log(set);
Run Code Online (Sandbox Code Playgroud)

Ric*_*ton 6

它返回未定义,因为您正在使用 设置数组长度set.length。当调用此函数时,数组的所有元素都会被undefined

我会set.length完全删除该行。

更新了代码

var set = [];
for (i = 0; i <= 50; i++) {
  set.push(Math.floor(Math.random() * 500))
}

console.log(set)
=> [138, 215, 149, 180, 348, 497, 88, 156, 238, 439, 130, 185, 20, 116, 330, 131, 188, 257,
    260, 1, 469, 482, 208, 494, 26, 374, 281, 403, 403, 137, 156, 243, 378, 281, 329,
    84, 471, 429, 120, 381, 456, 471, 36, 395, 299, 497, 151, 210, 80, 310]
Run Code Online (Sandbox Code Playgroud)


GKn*_*ght 5

听起来我想要创建一个带有动态内容的静态大小的数组.如果是这种情况,则需要先创建具有适当大小的数组.这将为您创建阵列.但是,您可以使用您想要的随机值自动填充数组:

var N = 50;
var set = Array.apply(null, {length: N}).map(Function.call, Math.random);
Run Code Online (Sandbox Code Playgroud)

一旦数组被自动填充,其余的代码应该按预期工作,只需使用数组中随机数的值,这样:

for(var i in set){
    set[i] = Math.floor(set[i] * 500) + 1;
}
console.log(set);
// OUTPUT
// [267, 219, 293, 298, 403, 70, 162, 270, 434, 292, 433, 478, 476, 
//  311, 268, 266, 105, 242, 255, 250, 206, 104, 142, 406, 50, 139, 
//  364, 375, 47, 480, 445, 149, 91, 228, 404, 267, 298, 158, 305, 
//  311, 92, 377, 490, 65, 149, 431, 28, 452, 353, 494]
Run Code Online (Sandbox Code Playgroud)

这就是我得到的:创建一个包含1 ... N的JavaScript数组


Hy-*_*Hy- 1

第二个链接似乎有你的答案。

for (var item in array)会查看您的数组,并且对于数组中的每个项目,将该项目存储在“item”中,并允许您迭代每个项目。设置 array.length 不会为您提供数组中的任何项目,因此for in根本不会执行 - 没有什么可以迭代的。