要返回一个数组set
,其序列的随机数在1到500之间,我尝试重构一个标准for for循环for(var i = 0; i< 50; i++)
,但是当我尝试使用{{{ 1}}循环它没有。我的猜测是for in
属性有一些东西,而且我用它搞砸了。
TL; DR 为什么这会返回50个未定义元素的数组,而不是50个随机整数的数组?有没有办法让这种方法有效?
array.length
类似问题:有帮助,但不是我想要的
我怀疑我遗漏的一点是设置var set = [];
set.length = 50;
for(var i in set){
set[i] = Math.floor((Math.random() * 500) + 1);
}
console.log(set);
没有向数组添加元素,它只创建一个稀疏数组(一个带有间隙的数组)。在我的情况下,您无法使用set.length
,因为数组中没有任何可以迭代。我要么必须使用虚拟内容(即空字符串)填充数组,或者更逻辑地将我尝试使用for in
属性实现的范围部分分隔为单独的.length
变量。
工作版
range
答案 0 :(得分:5)
听起来我想要创建一个带有动态内容的静态大小的数组。如果是这种情况,则需要先创建具有适当大小的数组。这将为您创建阵列。但是,您可以使用您想要的随机值自动填充数组:
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]
答案 1 :(得分:4)
它返回undefined,因为您使用 bundles.Add(new ScriptBundle("~/bundles/exampleBundle").Include(
"~/Scripts/jquery-masked.min.js"
"~/Scripts/jquery.idletimer.min.js"
));
设置数组长度。调用此方法时,数组的所有元素都是set.length
我完全删除undefined
行。
更新了代码
set.length
答案 2 :(得分:2)
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);
答案 3 :(得分:2)
问题不在于array.length
属性,而是这种扩大数组的方法不会创建&#34;属性。&#34;请注意以下事项:
> [ /*hole*/ , /*hole*/ ,] // An array with two "holes"
[ , ]
> new Array(2) // Another way to create an array with two holes
[ , ]
> [ undefined, undefined ] // An array with two undefined elements -- not the same
[ undefined, undefined ]
> Object.getOwnPropertyNames([undefined, undefined]);
[ '0', '1', 'length' ]
> Object.getOwnPropertyNames([,,]);
[ 'length' ] // Doesn't have any integer properties!
您正在做的是创建一个零元素的数组,然后将其扩展为包含50个&#34;孔,&#34;就像有两个洞的阵列一样。由于此数组没有可枚举的属性(length
不可枚举),因此您无法使用for...in
对其进行迭代。最终,您最好使用传统的for
循环。
&#34;洞的最佳定义&#34;我现在能想到的是一个数组不存在的属性,其名称是一个整数i
,使得0 <= i && i < array.length
。(考虑到这一点,重要的是请注意,JavaScript数组只是具有数字属性的对象,称为&#34; indices&#34;以及一些额外的特殊功能。)
有两种方法可以使属性引用返回undefined:属性不存在或属性存在且包含值undefined。因此:
> myObject = { myProp: 1, otherProp: undefined }
{ myProp: 1, otherProp: undefined }
> myObject.nonExistentProperty
undefined
> myObject.otherProp
undefined
现在,一个洞是一个不存在的属性,如上面的myObject.nonExistentProperty
,所以尝试访问它会导致它返回undefined
。
答案 4 :(得分:1)
第二个链接似乎有你的答案。
for (var item in array)
查看您的数组,对于数组中的每个项目,将该项目存储在“item”中,并让您迭代每个项目。设置array.length不会在数组中提供任何项目,因此for in
根本不执行 - 没有任何内容可以迭代。
答案 5 :(得分:0)
通过填充Array()
类然后使用Array.protype.fill()
方法为其赋值,可以简单地实现用填充值填充数组的最佳和最简单方法。
const array_filler = new Array(10).fill(20)
供进一步参考,您可以阅读以下article