我知道这似乎是不好的做法,但这是一个快速而肮脏的课程项目。
基本上,我想存储一个字符串并使用该字符串来调用数组。
例如,如果我的数据结构如下:
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 :(得分: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']