JavaScript对象未定义

时间:2015-04-30 04:05:24

标签: javascript jquery html arrays object

我正在为视频游戏制作一个小程序。问题在于,当它描述页面中的错误时,它会将某些对象读取为未定义的对象。

$(document).ready(function(){
        //A roster for all character choices.
        var roster = {
            Riven:{name: "Riven", rival: Jax, rival2: Pantheon}, 
            Pantheon:{name: "Pantheon", rival: Olaf, rival2: Darius},
            Veigar:{name: "Veigar", rival: Akali, rival2: Fizz},
            Olaf:{name: "Olaf", rival: Kayle, rival2: Kennen},
            Jax:{name: "Jax", rival: Malphite, rival2: Pantheon},
            Akali:{name: "Akali", rival: Garen, rival2: LeeSin},
            Malphite:{}, 
            Darius:{}, 
            LeeSin:{}, 
            Garen:{}, 
            Kayle:{},
            Fizz:{},
        };

它说对象Darius没有在Pantheon的对象中定义,或者在我在这段代码之后引用Darius的任何时候。但是,定义了Olaf,Akali和具有完整对象属性列表的任何人。我尝试将这些属性放入正在读取的对象中,因为这些属性未定义,但这不起作用。我是JavaScript的新手,我不知道该怎么做。如果它是相关的,我在我的HTML代码之前在脚本中调用jQuery库。

2 个答案:

答案 0 :(得分:0)

正如@charlietfl在评论中提到的那样,您尚未定义名为Jax的变量。定义roster后,您可以引用roster.Jax,但在完成对象定义之前无法引用它,因为在此之前roster尚未定义。

你必须这样做:

    var roster = {
        Riven:{name: "Riven"}, 
        Pantheon:{name: "Pantheon"},
        Veigar:{name: "Veigar"},
        Olaf:{name: "Olaf"},
        Jax:{name: "Jax"},
        Akali:{name: "Akali"},
        Malphite:{}, 
        Darius:{}, 
        LeeSin:{}, 
        Garen:{}, 
        Kayle:{},
        Fizz:{},
    };

然后分配这样的竞争对手:

roster.Riven.rival = roster.Jax;

那将是一团糟,所以我将从如下的数组开始。 (注意此时rivalrival2属性只是名称(字符串)。)

var characters = [
    { name: 'Riven', rival: 'Jax', rival2: 'Pantheon' },
    { name: 'Pantheon', rival: 'Olaf', rival2: 'Darius' },
    { name: 'Veigar', rival: 'Akali', rival2: 'Fizz' },
    { name: 'Olaf', rival: 'Kayle', rival2: 'Kennen' },
    { name: 'Jax', rival: 'Malphite', rival2: 'Pantheon' },
    { name: 'Akali', rival: 'Garen', rival2: 'LeeSin' },
    { name: 'Malphite' },
    { name: 'Darius' },
    { name: 'LeeSin' },
    { name: 'Garen' },
    { name: 'Kayle' },
    { name: 'Fizz' }
];

然后,您可以通过执行以下操作从阵列中创建名单对象。 (此时rivalrival2属性仍然只是名称(字符串)。)

var roster = {};
characters.forEach(function(character) {
    roster[character.name] = character;
});

如果您确实希望rivalrival2属性成为对象引用而不仅仅是名称,您可以使用以下代码转换它们。

characters.forEach(function(character) {
    character.rival = roster[character.rival];
    character.rival2 = roster[character.rival2];
});

如果你想支持两个以上的竞争对手:jsfiddle

答案 1 :(得分:0)

也许你拆分对象的声明:

// here is an empty or a default setting, just to avoid
// an undefined exception
var roster = {
            Malphite:{}, 
            Darius:{}, 
            LeeSin:{}, 
            Garen:{}, 
            Kayle:{},
            Fizz:{},
        };

然后是其他属性:

// here's the real declaration
roster = {
            Riven:{name: "Riven", rival: roster.Jax, rival2: roster.Pantheon}, 
            Pantheon:{name: "Pantheon", rival: roster.Olaf, rival2: roster.Darius},
            Veigar:{name: "Veigar", rival: roster.Akali, rival2: roster.Fizz},
            Olaf:{name: "Olaf", rival: roster.Kayle, rival2: roster.Kennen},
            Jax:{name: "Jax", rival: roster.Malphite, rival2: roster.Pantheon},
            Akali:{name: "Akali", rival: roster.Garen, rival2: roster.LeeSin},
            Malphite:{}, 
            Darius:{}, 
            LeeSin:{}, 
            Garen:{}, 
            Kayle:{},
            Fizz:{},
        };

在访问对象的属性

之前注意roster.前缀