如何使用for in循环

时间:2015-05-19 16:56:27

标签: javascript arrays for-in-loop

要返回一个数组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

6 个答案:

答案 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]

这是我得到的地方:Create a JavaScript array containing 1...N

答案 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