如何为动态创建的变量创建和赋值?

时间:2012-09-14 18:48:19

标签: javascript jquery eval

我正试图让它发挥作用:

function whatever(arg) {
  eval(arg) + '_group' = [];
}

目的是只有一个函数而不是三个具有基本相同的内容但具有不同的变量名。

最后我希望有类似的东西:

a_group = [];
b_group = [];

这样做,我收到了错误:

ReferenceError: Invalid left-hand side in assignment

修改

这是我正在尝试创作的原始功能。但它不起作用。

function collect_all_values_for(field_name) {

    switch(field_name) {
        case 'states':
            use = 'state';
        case 'cities':
            use = 'city';
        case 'neighborhoods':
            use = 'neighborhood';        
    }

    window[field_name + '_group'] = [];

    n_fields = $('[id^=' + use + '_]').length-1;

    i = 0;
    field_value = 0;
    for (i = 0; i<= n_fields; i++) {

        if (i == 0) {
            field_value = $('#' + use).val(); 
        }else{
            field_value = $('#' + use + '_id' + i).val();
        }

        //states_group.push(field_value);
        window[field_name + '_group'].push(field_value);
    }

}

查看控制台输出:

states_group
[undefined, undefined, undefined]

然后我应该可以将其称为:

collect_all_values_for('states');
collect_all_values_for('cities');
collect_all_values_for('neighborhoods');

提前致谢。

3 个答案:

答案 0 :(得分:3)

function whatever(arg) {
  window[arg + '_group'] = [];
}

这会将a_groupb_group设置为全局变量。

要访问这些变量,请使用:

window['a_group'], window['b_group']等等。

根据编辑

switch中,您应该使用break;

switch(field_name) {
    case 'states':
        use = 'state';
        break;
    case 'cities':
        use = 'city';
        break;
    case 'neighborhoods':
        use = 'neighborhood';   
        break;     
}

使用本地对象(没有窗口对象)以及更好的

var myObject = {};

function whatever(arg) {
  myObject[arg + '_group'] = [];
  // output: { 'a_group' : [], 'b_group' : [], .. }
}

// to set value
myObject[arg + '_group'].push( some_value );

// to get value
myObject[arg + '_group'];

答案 1 :(得分:1)

虽然你真的不应该使用eval这应该有帮助

eval(arg + '_group') = [];

答案 2 :(得分:1)

只是为了增加@ theparadox的答案 我更喜欢用以下方式进行切换。

var options =  {
    'states' : 'state',
    'cities': 'city',
    'neighborhoods': 'neighborhood'    
};
use = options[field_name];

demo

或者如果你只想删除最后一个字母,你可以这样做。

use = field_name.slice(0,-1);

demo