2013-04-13 48 views
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]的值。

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

+0

你打算添加某种分隔符? – FrankieTheKneeMan

+0

你已经可以;这是单向访问对象的方式。 –

回答

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'] 
+0

感谢您的回复。我只是尝试了这一点,它的工作原理就像我需要的一样!对不起,我忘记了'。'。在这个过程中追加这个没什么问题。 – 1080p

3

您可以通过使用括号标记用绳子访问对象,它甚至不是坏的初步实践这样做:

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

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

谢谢你的回答。这不是我正在寻找的。但你确实设法给我一个关于如何解决这个问题的想法。 – 1080p