使用字符串变量来访问对象的值

时间:2016-01-31 02:25:30

标签: javascript variables object selector javascript-objects

我有一个文字输入。

我希望用户能够在该文本输入中填写一些值,例如以下几个示例:

  • results[0].address_components[0].long_name
  • results[0].formatted_address
  • fo.o[0].bar(其中fo.o是单个密钥)
  • 等。 (几乎任何东西)

然后我想获取该值并将其用作某些已解析JSON的键。所以... ...

$.parseJSON('data.json').results[0].address_components[0].long_name会返回类似San Francisco的内容。

我该怎么做?

如果我将输入值保存为变量,请说selector,然后尝试$.parseJSON('data.json')[selector],它就会返回未定义。

如果我尝试使用regex选择器并将[的所有实例转换为.并删除所有]并在.拆分然后减少,则选择器如{{} 1}}(一键)会破...

提前致谢!

3 个答案:

答案 0 :(得分:1)

通常应该将parseJSON的结果设置为变量,而不是每次访问它时解析它。 parseJSON通常会转到C代码(取决于环境),但一遍又一遍地调用它仍然是非常低效的。

var res = $.parseJSON('data.json');

从那里,您可以像访问任何其他JavaScript对象一样访问它:

res.results,与res["results"]相同(在您的情况下似乎是某种数组)。

始终通过第二种形式.访问包含特殊字符(-res["fo.o"]以及几乎所有非a-zA-Z0-9)的字符串键。

请注意这个链,因此您可以完全按照res["fo.o"]["bar"]的方式访问res["fo.o"].bar

答案 1 :(得分:1)

我建议使用像lodash这样的JavaScript库(如果这在您的项目中可行,否则查看其实现可能会有所帮助):

它提供了大量的实用功能。 get函数完全符合您的要求,即它解析了对象上的路径。

示例代码(假设_是您的lodash引用):

var path = 'results[0].address_components[0].long_name'; // the user input
var data = $.parse('data.json');
var result = _.get(data, path); // resolves the path on the data object

至于fo.o属性名称,我怀疑会有一个简单的解决方案,因为这实际上会使你的语法模糊不清。您如何区分财产fo.ofo

答案 2 :(得分:0)

使用 eval 。你会把所有东西都作为一个字符串。所以只需根据输入连接字符串。然后评估它。例如:

var str = "$.parseJSON('data.json').results[0].address_components[0].long_name";

然后在运行时评估它。

var result = eval(str);