不能在JQuery中使用动态数组名称

时间:2011-06-22 21:50:41

标签: jquery arrays variables dynamic

我正在尝试通过数组进行迭代以获取下拉列表的国家/地区信息。

这些是数组:

var array_states_US = new Array("AL", "AK", "AR")
var array_states_names_US = new Array("Alabama", "Alaska", "Arkansas")

var array_states_MX = new Array("AG", "BN", "BS")
var array_states_names_MX = new Array("Aguascalientes", "Baja California", "Baja California Sur")

这是功能:

function buildDropdown(countryISO){
    var tmpArry = 'array_states_'  + countryISO;
    var tmpArryNames = 'array_states_names_' + countryISO;
    $(tmpArry).each(function(i) {
                $(stateSelectId).append($("<option></option>").attr("value", this).text($(tmpArryNames)[i]));
    });
}

但JQuery将$(tmpArry)和$(tmpArryNames)视为字符串而不是数组值。 (当我在过去的项目中使用MooTools时,动态var不是问题。)如果我使用$(array_states_MX)和$(array_states_names_MX)代替,那么它可以工作。但countryISO值必须是动态的。

使这项工作的正确语法是什么?

3 个答案:

答案 0 :(得分:4)

您可以使用window对象,因为所有全局变量都存储在那里。

tmpArry = 'array_states_'+countryISO;
$(window[tmpArry]).each(){}

或者,为什么不使用嵌套数组而不是将它们命名为单独的东西?

array_states[countryISO]

答案 1 :(得分:0)

要解决现在的问题,您需要在eval()tmpArray变量上使用tmpArrayNames

var tmpArray = eval('array_states_' + countryISO);

然而 eval是一项危险的功能,您应该通过重构代码来避免这种功能。

答案 2 :(得分:0)

我个人会完全重构这个以使用对象..

var isoStates = {
    'US': {
        'AL': 'Alabama',
        'AK': 'Alaska',
        'AR': 'Arkansas'
    },
    'MX': {
        'AG': 'Aguascalientes',
        'BN': 'Baja California',
        'BS': 'Baja California Sur'
    }
};

function buildDropdown(countryISO){
    var states = isoStates[countryISO];
    for(state in states)
    {
        $(stateSelectId).append($("<option></option>").attr("value", state).text(states[state]));
    }
}

http://jsfiddle.net/gaby/6gbWJ/

的工作演示