使用字符串调用变量

时间:2013-04-13 20:27:43

标签: javascript

我知道这似乎是不好的做法,但这是一个快速而肮脏的课程项目。

基本上,我想存储一个字符串并使用该字符串来调用数组。

例如,如果我的数据结构如下:

var test = {   top_level_01: 
                  {    second_level_01: [2, 3, 4],
                       second_level_02: [5, 6, 7]
                  },
               top_level_02:
                  {    second_level_03: ['a', 'b', 'c'],
                       second_level_04: ['d', 'e', 'f']
                  }
           }

我希望字符串在'top_level_01'初始化。但在某些时候,我可能想看到second_level_01。所以我希望字符串为'top_level_01'+“second_level_01”。然后我想调用该字符串并返回[2,3,4]的值。

这可能吗?再一次,我知道这是不好的做法,但这只是课堂项目概念的快速证明。

2 个答案:

答案 0 :(得分:3)

您可以使用括号表示法使用字符串访问您的对象,这样做甚至不是很糟糕:

var str1 = 'top_level_01',
    str2 = 'second_level_01';

var result = test[str1][str2]; // == [2, 3, 4]

答案 1 :(得分:1)

如果要在更深层次上访问对象属性,就像拥有它一样。你不能只使用字符串作为“top_level_01”+“second_level_01”,因为结果将是“top_level_01second_level_01”,如果你没有任何指定格式的每个级别,则不会携带有关你所指的对象的任何信息。我想解决这个问题的最简单方法是使用点符号。因此,在第一种情况下,您将拥有“top_level_01.second_level_01”,因此点将分隔级别。你可以使用你想要的任何字符而不是点,只要记住你不能在键名中使用它。

这段代码使用了点符号。我添加了一个函数“test.at()”,它将您的字符串作为参数并返回所需对象的对象引用。

            var test = {

                top_level_01 : {
                    second_level_01: [2, 3, 4],
                    second_level_02: [5, 6, 7]
                },

                top_level_02 : {
                    second_level_03: ['a', 'b', 'c'],
                    second_level_04: ['d', 'e', 'f']
                },

                at : function( str ) {
                    if ( ~str.indexOf('.') ) {
                        var keys = str.split('.'),
                            ref = this[ keys[0] ];

                        for ( var i = 1; i < keys.length; i++ ) {
                            ref = ref[ keys[i] ];
                        }

                        return ref;

                    } else {
                        return this[ str ];
                    }

                }
            }

            var str = 'top_level_02.second_level_03'

            test.at( str ); // ['a', 'b', 'c']