Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用for-in循环动态填充数组_Javascript_Arrays_For In Loop - Fatal编程技术网

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

Javascript 如何使用for-in循环动态填充数组,javascript,arrays,for-in-loop,Javascript,Arrays,For In Loop,要返回一个数组set,其随机数序列介于1和500之间,我尝试为(var I=0;IgetOwnPropertyNames([undefined,undefined]); ['0','1','length'] >getOwnPropertyNames([,,]); ['length']//没有任何整数属性! 您要做的是创建一个包含零个元素的数组,然后将其扩展为包含50个“孔”,就像有两个孔的数组一样。因为此数组没有可枚举属性(length不可枚举),您不能在中使用for…对其进行迭代。最终,您最

要返回一个数组
set
,其随机数序列介于1和500之间,我尝试为(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);
类似问题:有用,但不完全是我想要的

更新 正如我所怀疑的,我缺少的一点是设置
set.length
不会向数组中添加元素,它只会创建一个稀疏数组(带间隙的数组)。在我的例子中,您不能在
中使用
,因为数组中没有任何东西可以迭代。我要么用虚拟内容(即空字符串)填充数组,要么更合理地说,将我试图用
.length
属性实现的范围部分分离到一个单独的
范围
变量中

工作版本

var set = [], range = 50;

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

console.log(set);
var集=[],范围=50;
对于(变量i=0;i
它返回undefined,因为您正在使用
set.length
设置数组长度。调用此函数时,数组的所有元素都
未定义

我将删除
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]
var集=[];
对于(i=0;i[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]

for in
似乎不是您在此处想要的。请尝试
for
循环:

var set = [], 
    i = 0, 
    l = null;

set.length = 50;

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

console.log(set);
var set=[],
i=0,
l=零;
set.length=50;
对于(;l=set.length;i
第二个链接似乎有你的答案


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

我觉得您似乎想要创建一个静态大小的数组,其中包含动态内容。如果是这种情况,则需要使用pr创建数组首先是操作大小。这将为您创建数组。但是,您可以使用所需的随机值自动填充数组,如下所示:

var N = 50;
var set = Array.apply(null, {length: N}).map(Function.call, Math.random);
一旦数组被自动填充,剩下的代码应该按照预期工作,只需使用数组中随机数的值,以便:

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]

这就是我得到的结论:

问题不在于
数组。length
属性,而是这种放大数组的方法不会创建“属性”。请注意以下几点:

[/*孔*/,/*孔*/,]//有两个“孔”的数组
[ ,  ]
>new Array(2)//创建具有两个孔的阵列的另一种方法
[ ,  ]
>[undefined,undefined]//包含两个未定义元素的数组--不同
[未定义,未定义]
>getOwnPropertyNames([undefined,undefined]);
['0','1','length']
>getOwnPropertyNames([,,]);
['length']//没有任何整数属性!
您要做的是创建一个包含零个元素的数组,然后将其扩展为包含50个“孔”,就像有两个孔的数组一样。因为此数组没有可枚举属性(
length
不可枚举),您不能在
中使用
for…对其进行迭代。最终,您最好使用传统的
for
循环

编辑
我能当场想到的“洞”的最佳定义是数组的一个不存在的属性,其名称是整数
I
,因此
0用填充值填充数组的最佳和最简单的方法可以简单地通过实例化
array()
类,然后使用
array.protype.fill()
方法来给它赋值

const数组\u filler=新数组(10)。填充(20)


为了进一步参考,您可以阅读以下内容

您不能以这种方式增加数组的大小。未定义与孔有何不同?在我的示例中,当我访问
set[2]
时,为什么它返回未定义?@jeanpier\u请参阅我的编辑。简言之,
set[2]
返回undefined,因为
2
不作为
set
的属性存在。从技术上讲,“数组的所有元素都是
未定义的”
:事实是,数组没有元素,这可以通过使用
对象来确定。getOwnPropertyNames(set)
。请参阅。我在您的链接中找到了当前困境的答案(Niko Ruotsalainen使用spread发布的帖子)。谢谢!