不使用eval动态形成JSON对象遍历

发布于 2024-08-26 22:20:22 字数 358 浏览 2 评论 0原文

假设我有以下内容:(动态生成且长度不同)

associations = ["employer", "address"];

尝试遍历 JSON 对象,并希望形成如下所示的内容:

data.employer.address

data[associations[0]][association[1]]

不执行此操作:

eval("data."+associations.join('.'));

最后,我可能会因为这样说而被回避,但是在这样的情况下使用 eval 可以吗?只是检索数据。

Given I have the following: (which is dynamically generated and varies in length)

associations = ["employer", "address"];

Trying to traverse the JSON object, and wanting to form something like the following:

data.employer.address

or

data[associations[0]][association[1]]

Without doing this:

eval("data."+associations.join('.'));

Finally, I may be shunned for saying this, but is it okay to use eval in an instance like this? Just retrieving data.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

初见 2024-09-02 22:20:22

为什么不直接迭代你的关联呢?

function traverse(data, associations){
  for (var i=0; i<associations.length; i++){
      data = data[associations[i]];
  }
  return data;
}

您的 eval 方法必须生成一个新字符串并解析代码,然后才能开始遍历。

Why not just iterate over your associations?

function traverse(data, associations){
  for (var i=0; i<associations.length; i++){
      data = data[associations[i]];
  }
  return data;
}

Your eval method has to generate a new string and parse the code before it can even start traversing.

傲娇萝莉攻 2024-09-02 22:20:22

这是使用原型的一种方法。

$A(associations).inject(data, function (obj, method) {
  return obj[method];
});

如果您可以保证用户不会影响您传递给它的字符串,那么使用 eval 就可以了。如果您的输入来自用户或来自用户可能更改的 URL,您可能应该避免 eval

Here’s one way using Prototype.

$A(associations).inject(data, function (obj, method) {
  return obj[method];
});

Using eval is fine if you can guarantee the user won’t be able affect the string you’re passing to it. If your input is coming from the user or from a URL that could be changed by the user, you should probably avoid eval.

染年凉城似染瑾 2024-09-02 22:20:22

您始终可以创建动态脚本节点。例如:

var yo = document.createElement("script");
yo.setAttribute("type", "text/javascript");
yo.innerHTML = "alert('yo!');";
document.body.appendChild(yo);

不需要评估。

You can always create a dynamic script node. For instance:

var yo = document.createElement("script");
yo.setAttribute("type", "text/javascript");
yo.innerHTML = "alert('yo!');";
document.body.appendChild(yo);

No eval required.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文