访问动态命名对象属性

时间:2012-03-28 19:51:50

标签: javascript javascript-objects

我正在创建一个javavascript对象,我正在调用rulesObject。我们的想法是成为一个javascript对象,其中包含我需要检查的所有规则,以启用/禁用在脚本开头从mysql数据库动态生成的其他复选框。现在,我只是用两条规则测试它,我知道创建我正在寻找的场景,所以这就是我的对象目前的样子:

rulesObject = {
        chk533570 : ["533577", "503671", "503667", "604028", "503661"],
        chk503928 : ["533577", "533578","503671", "503666", "533576", "503667", "324201", "503221", "604028", "503668", "533580", "503669", "533579", "533581", "503670"]
};    

现在我需要做的是从该对象中访问信息。如果我做一个简单的警报(rulesObject。chk533570),它完美地工作 - 给我正是我需要的。但是,我需要做的是通过运行以下内容,根据刚刚点击的内容访问特定规则。因此,例如,如果我点击了值为“533570”的复选框,它将经历以下内容:

$('input').click(function(){            
if(this.checked) { 
    checkRules(this.value, 'checked'); 
} else { 
    checkRules(this.value, 'unchecked'); 
}           
});    

(当然我在那里使用jQuery,但我在整个网络应用程序中使用它,所以我不介意来回走。)

现在进入我的checkRules函数。它仍然非常简单,因为它处于开始阶段 - 我只想提醒我刚才选择的价值。再次,如果我做警报(rulesObject。chk533570),即使在函数内,我得到了正确的结果,但我需要访问我刚刚选择的内容,所以我必须将字母'chk'添加到对象属性的开头name,然后追加刚刚选择的值(在本例中等于533570)。以下是我尝试过的方法:

function checkRules(justselected, state) { 
        rulename= 'chk' + justselected;
        currentrules = rulesObject.rulename;

        alert(rulename);        
        alert(currentrules); 
}

警报1:chk533570 警报2:未定义

function checkRules(justselected, state) { 
        rulename= 'chk' + justselected;

        alert(rulesObject.rulename); 
}     

警告:未定义

function checkRules(justselected, state) { 
        rulename= 'chk' + justselected;

        alert(rulesObject + '.chk' + justselected); 
}     

提醒:[对象] .chk533570

function checkRules(justselected, state) {     
        alert(rulesObject.chk533570);
}     

警告:533577,503671,503667,604028,503661

那么,任何想法如何正确地调用该名称以便我得到正确的结果?我也尝试过根本没有'chk',但javascript对象不喜欢完全数字属性。

1 个答案:

答案 0 :(得分:1)

obj.keyobj['key']相同 - 但在第二种方式中,密钥可以是动态的,因为它是一个简单的JavaScript表达式。

所以你可以简单地使用rulesObject['chk' + justselected]

function checkRules(justselected, state) {     
        alert(rulesObject['chk' + justselected]);
}

很久以前,人们习惯使用 alert(eval('rulesObject.chk' + justselected)); 。虽然这有效,但不要使用此。应始终避免使用eval();在这种情况下,无论如何都有一个更清洁的方式。