【问题标题】:looping through object literal and array遍历对象字面量和数组
【发布时间】:2013-04-26 05:18:22
【问题描述】:

我相信我的对象文字和数组循环存在问题。 我正在尝试在之前使用数组的“地图”中使用对象文字。我想使用对象文字的原因是因为我想要一个变量来显示它所在位置的名称。截至目前,我总是遇到 loc[2][1] = player; 的问题。

var room0 = [
        [blank, blank, blank, blank],
        [blank, blank, blank, blank],
        [blank, player, blank, doorRight],
        [blank, blank, blank, blank]
];
var room1 = [
        [blank, blank, blank, blank],
        [blank, blank, blank, blank],
        [blank, blank, blank, blank],
        [blank, blank, blank, blank]
];

var loc = room0;

var map = {
    "living room": room0,
    "Bedroom": room1,
    "Outside": room2
};

function moveRight() {
    for (var y = 0; y < loc.length; y++) {
        var posX = loc[y].indexOf(player);
        if (posX <= -1) continue;

        // if going to the next room to the right
        if (loc[y][posX+1] == doorRight) {

            for (var name in map) {
                if (loc == map[name]) {
                    var rightLoc = map[name+1];
                }
            }


            loc[y][posX] = blank;
            loc = rightLoc;
            loc[2][1] = player;
            break;
        }

        if (loc[y][posX+1]  != blank) break;
        if (posX < loc[y].length - 1) {
            loc[y][posX] = blank;
            loc[y][posX + 1] = player; 
        }
        break;
    }
}

【问题讨论】:

  • room2 定义在哪里?
  • 这与实际问题无关,但是:这已经是我建议使用类的那种复杂性。这也将使房间命名更容易。
  • @IngoBürk:这有什么帮助?那么所有这些变量都将是对象属性,并且……?
  • 也许我在解释发生了什么方面做得很差......我会尝试编辑它以使其更清晰。
  • 我认为没有必要向您显示播放器的定义位置或房间 2。抱歉,我只是没想到你会想看很多代码.... player/room2/blank 的定义显然不是这里的问题。

标签: javascript arrays object for-loop for-in-loop


【解决方案1】:

当到达那行代码时,看起来 rightLoc 将是未定义的。

变量rightLoc被设置为map[name + 1]的值

因为map的属性是字符串,所以name + 1会是一个以1结尾的字符串。

因此,map[name + 1] 未定义,无法取消引用。

关键是您的 for 循环正在遍历对象的属性。

对于循环的每次迭代,名称都是一个字符串。

这里有一个 fiddle 来说明问题:

var map = {
    "living room": 'room0',
        "Bedroom": 'room1',
        "Outside": 'room2'
};

for (var name in map) {
    if (name === 'Bedroom') {
        var badKey = name + 1;
        var theType = typeof map[badKey];
        alert('key: ' + badKey + ' type: ' + theType);
    }
}

输出:

key: Bedroom1 type: undefined 

如果您阅读MDN documentation,您会看到for in 循环任意顺序 迭代对象属性,这意味着该技术将不起作用。


两个重要的工具可以帮助您更快地发现此类错误:

  • 阅读文档(谷歌“javascript mdn for in loop”)
  • 学习使用调试器(使用 Firebug 检查变量超级简单)

【讨论】:

    【解决方案2】:

    您只需要在地图中保存不同的东西,因为map[name+1] 不会神奇地指向由name 标识的下一个房间。

    var map = {
        "living room": 0,
        "Bedroom": 1,
        "Outside": 2
    };
    
    var rooms = [room0, room1, room2];
    

    现在,map['living room'] 将在rooms 中保存索引,因此您仍然可以使用数字加法“移动”到下一个房间。您的代码将变为:

    var rightLoc;
    
    for (var name in map) {
        if (loc == map[name]) {
            rightLoc = map[name] + 1;
        }
    }
    
    loc = rooms[rightLoc];
    

    这段代码仍然缺少一些检查来确保你总是有一个房间可以进入,但我相信你可以自己弄清楚:)

    【讨论】:

      猜你喜欢
      • 2015-07-10
      • 2017-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多