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发布的帖子)。谢谢!