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

Javascript 使用字符串变量访问对象的值,javascript,variables,object,selector,javascript-objects,Javascript,Variables,Object,Selector,Javascript Objects,我有一个文本输入 我希望用户能够在文本输入中填写一个值,如以下示例所示: results[0]。address\u components[0]。long\u name 结果[0]。格式化的\u地址 fo.o[0].bar(其中fo.o是一个单键) 等等(几乎可以说是任何东西) 然后我想获取该值并将其用作某个已解析JSON上的键。就像 $.parseJSON('data.json')。结果[0]。地址\u组件[0]。长\u名称将返回类似于旧金山的内容 我该怎么做 如果我将输入值保存为变量,比如

我有一个文本输入

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

  • results[0]。address\u components[0]。long\u name
  • 结果[0]。格式化的\u地址
  • fo.o[0].bar
    (其中
    fo.o
    是一个单键)
  • 等等(几乎可以说是任何东西)
然后我想获取该值并将其用作某个已解析JSON上的键。就像

$.parseJSON('data.json')。结果[0]。地址\u组件[0]。长\u名称
将返回类似于
旧金山
的内容

我该怎么做

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

如果我尝试对选择器进行正则化,并将
[
的所有实例转换为
并删除所有
]
并在
处拆分,然后减少,那么像
fo.o
这样的选择器(一键)将断开


提前谢谢

通常应将parseJSON的结果设置为变量,而不是每次访问时都对其进行解析。parseJSON通常会使用C代码(取决于环境),但反复调用它仍然会非常低效

var res = $.parseJSON('data.json');
从那里,您可以像访问任何其他JavaScript对象一样访问它:

res.results
,它与
res[“results”]
相同(在您的例子中,它似乎是某种数组)

带有特殊字符(
-
,以及几乎所有非A-zA-Z0-9的字符)的字符串键总是通过第二种形式访问:
res[“fo.o”]


请注意,这是一个链接,因此您可以访问
res[“fo.o”][“bar”]
,就像访问
res[“fo.o”].bar一样。通常,您应该将parseJSON的结果设置为一个变量,而不是每次访问它时都对其进行解析。parseJSON通常会使用C代码(取决于环境),但反复调用它仍然会非常低效

var res = $.parseJSON('data.json');
从那里,您可以像访问任何其他JavaScript对象一样访问它:

res.results
,它与
res[“results”]
相同(在您的例子中,它似乎是某种数组)

带有特殊字符(
-
,以及几乎所有非A-zA-Z0-9的字符)的字符串键总是通过第二种形式访问:
res[“fo.o”]


请注意,这是一个链接,因此您可以访问
res[“fo.o”][“bar”]
,完全按照您的地址访问
res[“fo.o”].bar

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

它提供了大量实用功能。该函数的作用正是您要查找的,即它解析对象上的路径

示例代码(假设
\uu
是您的
lodash
参考):


至于
fo.o
属性名,我怀疑是否有一个简单的解决方案,因为这本质上使您的语法模棱两可。如何区分属性
fo.o
fo

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

它提供了大量实用功能。该函数的作用正是您要查找的,即它解析对象上的路径

示例代码(假设
\uu
是您的
lodash
参考):


至于
fo.o
属性名,我怀疑是否有一个简单的解决方案,因为这本质上使您的语法模棱两可。如何区分属性
fo.o
fo

使用eval。你会把一切都当作一根绳子。因此,只需根据输入连接字符串即可。然后评估它。例如:

var str = "$.parseJSON('data.json').results[0].address_components[0].long_name";
然后在运行时对其进行评估

var result = eval(str);

使用评估。你会把一切都当作一根绳子。因此,只需根据输入连接字符串即可。然后评估它。例如:

var str = "$.parseJSON('data.json').results[0].address_components[0].long_name";
然后在运行时对其进行评估

var result = eval(str);

我想诀窍应该是将
fo.o
用双引号之类的东西括起来。我会查到洛达斯,谢谢!=)我也是这么想的。。。不过,我认为lodash无法处理这个问题,在调用lodash
get
函数之前,您可能必须首先在自己的代码中拆分输入的路径。现在,我已经有了正则表达式来转换
results[0]。address\u components[0]。long\u name
[“results”][0][“address\u components”][0][“long\u name”]
但现在我不知道如何将该字符串与解析后的JSON结合起来。。。我尝试的所有操作都只是将它们连接到一起,形成
[object object][“results”][0][“address\u components”][0][“long\u name”]
console.log(parsedJSON[“results”][0][“address\u components”][0][“long\u name”])
确实有效。要使用lodash的
get
函数,您应该能够使用原始用户输入(如您的问题中所述,
results[0]。address\u components[0]。long\u name
)作为第二个参数。第一个参数是从
$.parseJSON('data.json')
获取的对象。唯一需要单独处理的情况是包含特殊字符的属性,例如
。我想技巧是将
fo.o
用双引号或其他方式括起来。我会查到洛达斯,谢谢!=)我也是这么想的。。。但是我认为lodash无法处理这个问题,在调用lodash
get
函数之前,您可能必须首先在自己的代码中拆分输入的路径。现在,我有了正则表达式来转换
results[0]。address_components[0]。long_name
[“results”][0]