Javascript 无法将传统for循环转换为for each循环
出于某种莫名其妙的原因,我无法将此循环转换为(FizzPlayer中的var player){…}循环的更自然的Javascript 无法将传统for循环转换为for each循环,javascript,for-loop,Javascript,For Loop,出于某种莫名其妙的原因,我无法将此循环转换为(FizzPlayer中的var player){…}循环的更自然的: for (var i = 0; i < fizzPlayers.length; i++) { var player = fizzPlayers[i]; var val = parseInt(player.value); if (val != 0) { active.push(player); actfact.push(par
:
for (var i = 0; i < fizzPlayers.length; i++) {
var player = fizzPlayers[i];
var val = parseInt(player.value);
if (val != 0) {
active.push(player);
actfact.push(parseInt(player.value));
actname.push(capitaliseFirstLetter(player.id));
}
}
但是它不起作用,正如您在底部的可运行代码片段中看到的那样
为了进行调试,我在循环之前插入了以下代码:
// prints undefined... but why?
for (var player in fizzPlayers) {
console.log(player.value);
}
它为5名玩家打印未定义的
。为什么?程序前面有一个类似的循环,for(fizzPlayers中的var-player){…}
循环工作正常
为什么会这样?我错过了什么
var fizzLoaded=false;
var fizzDiv、fizzFrom、fizzTo、fizzPlayers;
函数fizzLoad(){
如果(满负荷){
返回;
}
fizzLoaded=true;
var fizzForm=document.getElementById('fizzbuzz');
fizzFrom=document.getElementById('rangeFrom');
fizzTo=document.getElementById('rangeTo');
起泡剂=[
document.getElementById('frodo'),
document.getElementById('sam'),
document.getElementById('merry'),
document.getElementById('pippin'),
document.getElementById('bilbo')
];
fizzDiv=document.getElementById('fizzOut');
}
函数限制范围(){
var rFrom=parseInt(fizzFrom.value);
var rTo=parseInt(fizzTo.value);
fizzTo.min=rFrom;
fizzFrom.max=rTo;
}
函数validateValues(){
var rFrom=parseInt(fizzFrom.value);
var rTo=parseInt(fizzTo.value);
如果(rTo100){
警报(“非法值”+val+“对于玩家”+player.id);
返回false;
}
}
返回true;
}
函数资本主义者(字符串){
返回string.charAt(0.toUpperCase()+string.slice(1);
}
函数嘶嘶作响(){
fizzLoad();
限制范围();
如果(!validateValues()){
fizzDiv.innerHTML=“非法输入”;
返回;
}
var表=”;
var rFrom=parseInt(fizzFrom.value);
var rTo=parseInt(fizzTo.value);
var活跃=[];
var actfact=[];
var actname=[];
//打印未定义…但为什么?
for(FizzPlayer中的var播放器){
console.log(player.value);
}
for(FizzPlayer中的var播放器){
var val=parseInt(player.value);
如果(val!=0){
主动推(玩家);
push(parseInt(player.value));
actname.push(capitaliefirstletter(player.id));
}
}
表+=“\n”;
表+=“ValueMessage\n”;
对于Javascript中的(var i=rFrom;i,for each
循环将索引分配给控制变量,因此您需要使用fizzPlayers[player]
,而不仅仅是player
。您可能不喜欢它(我通常不喜欢),但它就是这样工作的。JavaScript
中的for in
循环在对象的可枚举属性中运行。因此,您不能将其转换为经典的for
循环。更正式地说,从:
for…in循环只在可枚举属性上迭代
从内置构造函数(如数组和对象)创建
从Object.prototype和继承的不可枚举属性
prototype,例如字符串的indexOf()方法或对象的
方法。循环将迭代所有可枚举的
对象本身的属性以及对象从其继承的属性
构造函数的原型(属性更接近
原型链覆盖原型的属性)
你需要
for (var p in fizzPlayers) {
console.log(fizzPlayers[p].value);
}
这是一种常见的烦恼
编写循环遍历数组元素的惯用方法是
forEach
。正如注释所指出的,for…in
用于对象键,而不是数组元素
fizzPlayers.forEach(function(player) {
var val = parseInt(player.value);
if (val != 0) {
active.push(player);
actfact.push(parseInt(player.value));
actname.push(capitaliseFirstLetter(player.id));
}
});
您可以在中Array.prototype.forEach
检查实际分配给
玩家的内容
:
> fizzPlayers = ["jim", "bob", "joe"]
> for (var player in fizzPlayers) {
console.log(player);
}
0
1
2
遍历对象会得到关键点。数组的关键点就是索引。在这种情况下,最好使用常规的for循环,而不是每个循环都使用这个for循环,因为如果您为数组指定了任何其他属性(如fizzPlayers.barg=40;
),则for-each循环也会给出这些属性名称
但是,如果您使用的是jQuery,则可以使用:
请注意,回调包含两个参数:索引和值。for each循环分配索引
// prints undefined... but why?
for (var playerIndex in fizzPlayers) {
console.log(fizzPlayers[playerIndex].value);
}
你可以考虑一个方便的库,比如实用程序。
右,< <代码> >在循环中与<<代码>循环不一样。你不应该在中使用<代码>来循环数组。谢谢,这非常有见识!你有没有链接到这个主题的正确文档?ks,请将其编辑到您的答案中,这样对每个人来说都更容易阅读。顺便说一句,为什么在validateValues
函数中,player
引用数组中每个元素的索引,比如0
。一个数字没有值
属性,所以player
引用数组中每个元素的索引de>player.value为未定义
parseInt(未定义)
为NaN
,既不小于0也不大于100。
> fizzPlayers = ["jim", "bob", "joe"]
> for (var player in fizzPlayers) {
console.log(player);
}
0
1
2
> $.each(fizzPlayers, function (index, player) {
console.log(index + ": " + player);
});
0: jim
1: bob
2: joe
// prints undefined... but why?
for (var playerIndex in fizzPlayers) {
console.log(fizzPlayers[playerIndex].value);
}