我用 Javascript 创建了一个数组,旨在保存有关一组升级的基本详细信息,作为我正在制作的游戏的一部分。升级定义如下;
var Upgrade = {Name:NameIn,
Description:DescriptionIn,
Image:ImageIn,
Purchased:0,
Visible:false,
ID:IDIn}
我有一个标准的 for 循环正在尝试访问这些变量。然而,由于某种原因,当我尝试使用我在循环中创建的 i 变量来访问描述变量时,它会出现“未定义”错误。即 Upgrades[i].Description
显示为未定义。
我已经检查过,所有其他元素(例如名称、图像等)都可以使用“i”变量访问。例如升级[i].Name
但是,如果我在尝试访问描述时手动输入 i 等于代码的一部分(例如,使用 Upgrades[1]
与 Upgrades[i ]
)它允许访问它。
数组已这样填充;
function AddUpgrade(NameIn,DescriptionIn,ImageIn,IDIn){
var Upgrade = {Name:NameIn,
Description:DescriptionIn,
Image:ImageIn,
Purchased:0,
Visible:false,
ID:IDIn}
Upgrades.push(Upgrade);
AddUpgrade("Sharpened Rocks","Description",
"img/upgrades/Caveman2.png","Caveman2Display");
下面是尝试访问变量以发送到 HTML 文档的循环;
for (i = 1; i < Upgrades.length ; i++){
if (Upgrades[i].Visible == 1){
document.getElementById("upgrades").innerHTML += "<div class=\"upgrade\" id=\"" + Upgrades[i].ID +
"\" onclick=\"ButtonBuyUpgrade(" + i + ")\"><img src=\"" + Upgrades[i].Image + "\"><div class=\"hovertext\" id=\""
+ Upgrades[i].ID + "Hover\">" + DisplayUpgradeCost(i) + Upgrades[i].Description + "</div></div>";
}
}
这是控制台的输出;
Uncaught TypeError: Cannot read property 'Description' of undefined inc.js:161 DisplayUpgrade inc.js:161 CalculateUnlocks inc.js:463 (anonymous function) inc.js:502 Object {Name: "Sharpened Rocks", Description: "Description", Image: "img/upgrades/Caveman2.png", Purchased: 0, Visible: 1…} Description: "Description" ID: "Caveman2Display" Image: "img/upgrades/Caveman2.png" Name: "Sharpened Rocks" Purchased: 0 Visible: 1
这是 console.dir 输出;
1:对象 描述:“描述” ID:“穴居人2显示” 图片:“img/upgrades/Caveman2.png” 名称:《削尖的岩石》 已购买:0 可见:1
所有其他元素也已填写,没有遗漏的信息。
我对此感到完全困惑,不知道为什么会发生这种情况。有什么想法吗?
最佳答案
看起来您已经创建了一个对象。对象是键:值对的集合。数组是按索引(从 0 开始)排序的元素的集合,用 [] 表示。要循环访问您的对象,请尝试 forIn 循环:
var Upgrade = {
Name:'NameIn',
Description:'DescriptionIn',
Image:'ImageIn',
Purchased:0,
Visible:'false',
ID:'IDIn'
}
for(var i in Upgrade) {
console.log(Upgrade[i])
}
关于Javascript数组变量未定义,在for循环中使用 "i"来访问,但使用绝对值时可用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25404063/