如何在不使用eval的情况下动态访问JSON节点?

时间:2014-11-19 23:15:20

标签: javascript jquery json eval

路径变量是不可预测的。有时它只是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

2 个答案:

答案 0 :(得分:2)

您可以直接在循环中访问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;
}

答案 1 :(得分:1)

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