未定义JavaScript对象

未定义JavaScript对象,javascript,jquery,html,arrays,object,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",

我正在为自己制作一个视频游戏小程序。问题是,当它在页面中指出错误时,它读取某些未定义的对象

$(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:{},
        };

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

正如@charlietfl在评论中提到的,您还没有定义名为
Jax
的变量。定义
花名册
后,可以引用
花名册.Jax
,但在定义完对象之前不能引用它,因为在此之前
花名册
仍然未定义

您必须这样做:

    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;

这将是一个混乱,因此我将从如下数组开始。(请注意,
rival
rival2
属性此时只是名称(字符串)

然后,可以通过执行以下操作从数组创建花名册对象。(此时,
rival
rival2
属性仍然只是名称(字符串)

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

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


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

如果您拆分对象的声明,可能:

// 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:{},
        };

请注意
花名册。
在访问对象属性之前的前缀

可能是您没有关闭文档准备功能。})。对象属性键不是变量。您可以随时创建任意命名的属性,但您不能像在嵌套对象中那样使用该属性名作为变量。这只是一个小问题——为什么Jax不是万神殿的竞争对手之一?@JonMarkPerry没有理由。只是想让代码正常工作。:)
// 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:{},
        };