我有一个文字输入。
我希望用户能够在该文本输入中填写一些值,例如以下几个示例:
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}}(一键)会破...
提前致谢!
答案 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.o
和fo
?
答案 2 :(得分:0)
使用 eval 。你会把所有东西都作为一个字符串。所以只需根据输入连接字符串。然后评估它。例如:
var str = "$.parseJSON('data.json').results[0].address_components[0].long_name";
然后在运行时评估它。
var result = eval(str);