【问题标题】:Use string variable to access value of object使用字符串变量访问对象的值
【发布时间】:2016-01-31 02:25:29
【问题描述】:

我有一个文本输入。

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

  • 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],它只是返回未定义。

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

提前致谢!

【问题讨论】:

    标签: javascript variables object selector javascript-objects


    【解决方案1】:

    一般应该将 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一样。

    【讨论】:

    • 是的,我将它分配给一个 var。我想我只是把它作为一个例子发布了。感谢您对res["fo.o"]["bar"] 工作的提醒。我现在可能可以迭代并弄清楚。 =)
    【解决方案2】:

    我建议为此使用像 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

    【讨论】:

    • 我想诀窍是将fo.o 用双引号或其他东西括起来。我去看看lodash,谢谢! =)
    • 我也是这么想的...不过我不认为 lodash 可以处理这个问题,您可能必须先在自己的代码中拆分输入的路径,然后再调用 lodash @987654331 @函数。
    • 好吧,我现在有正则表达式可以将 results[0].address_components[0].long_name 转换为 ["results"][0]["address_components"][0]["long_name"] 但现在我不知道如何将该字符串与我解析的 JSON 结合起来......我尝试的所有内容都只是连接他们一起变成[object Object]["results"][0]["address_components"][0]["long_name"]console.log(parsedJSON["results"][0]["address_components"][0]["long_name"]) 确实有效。
    • 要使用 lodash 的 get 函数,您应该能够使用原始用户输入(如您的问题,例如 results[0].address_components[0].long_name)作为第二个参数。第一个参数是您从$.parseJSON('data.json') 获得的对象。您必须单独处理的唯一情况是包含特殊字符的属性,例如 .
    【解决方案3】:

    使用评估。您会将所有内容都作为字符串。所以只需根据输入连接字符串。然后评估它。例如:

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

    然后在运行时对其进行评估。

    var result = eval(str);
    

    【讨论】:

    • 不结合用户输入和 eval 是否有一些神圣的规则?
    • 好吧,无论如何它看起来像是一个程序员工具。什么都行。
    最近更新 更多