【问题标题】:How can i reach a JSON node dynamically without using eval?如何在不使用 eval 的情况下动态到达 JSON 节点?
【发布时间】:2014-11-19 23:15:19
【问题描述】:

路径变量是不可预测的。有时只是a,有时是a/b,有时是a/b/c等。我想根据路径动态到达一个节点。下面的代码符合我的要求,但如果没有eval,我可以考虑是否有更好的方法。

http://jsfiddle.net/nuonzngv/1/

cont = {
    "a" : {
        "b": {
            "c": "d"
        }   
    }
}
path = "a/b/c";
sect = path.split("/");

path = "cont";
$.each(sect, function( index, value ) {
    path = path + "['" + value + "']";
});

console.log(eval(path));

解决方案

我找到了一个包含 getPath 函数的插件,用于 underscore.js: https://github.com/documentcloud/underscore-contrib/blob/master/docs/underscore.object.selectors.js.md

【问题讨论】:

  • 为什么不在循环中直接访问cont
  • 将当前结构转换为具有许多属性(也称为扁平化)的单个对象可能更简单,这可以动态完成。参考stackoverflow.com/questions/19436457/…如果您需要a/b/c 转换为abc,您可以修改答案以包含每个级别的父属性名称。
  • 路径来自 URL
  • 查看这篇关于按键查找嵌套对象的帖子:stackoverflow.com/questions/2631001/…。解决问题的方法很多。
  • 看起来 lodash 有一个 getPath 函数可以完成这项工作。如果 underscore.js 有类似的功能会很棒吗?我真的不想在我的项目中包含另一个库);

标签: javascript jquery json eval


【解决方案1】:

您可以直接在循环中访问您的cont 对象吗?如果是这样:

var cont = {
    "a" : {
      "b": {
        "c": "d"
      }   
    }
  },
  o = cont,
  path = "a/b/c",
  sect = path.split("/");

path = "cont";
$.each(sect, function(index, value) {
  path = path + "['" + value + "']";
  if (o) o = o[value];
});

console.log(path+'='+o);

给予:

cont['a']['b']['c']=d

无效路径将返回undefined


*编辑psibernetic建议创建独立函数的评论:

function GetByPath(obj, path) {
  var result = obj;
  $.each(path.split("/"), function(index, value) {
    if (typeof result !== 'undefined' && result !== null) {
      result = obj[value];
    }
  }
  return result;
}

【讨论】:

  • function GetByPath(cont, path) { var result = cont; $.each(path.split("/"), function(index, value) { if(typeof result !=== 'undefined' && result !== null) { result = cont[value]; } } 返回结果; }
【解决方案2】:
function GetByPath(cont, path)
{
     var result = cont;
     $.each(path.split("/"), function(index, value) {
        if(typeof result !== 'undefined' && result !== null) {
            result = cont[value];
        }
     }
     return result;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多