0

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

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

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

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] 的值。

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

4

2 回答 2

3

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

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

var result = test[str1][str2]; // == [2, 3, 4]
于 2013-04-13T20:29:35.863 回答
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']
于 2013-04-13T21:23:13.107 回答