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

How can i reach a JSON node dynamically without using eval?

本文关键字:动态 情况下 访问 JSON 节点 eval      更新时间:2023-09-26

路径变量是不可预测的。有时只是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函数,用于下划线.js:https://github.com/documentcloud/underscore-contrib/blob/master/docs/underscore.object.selectors.js.md

您可以直接在循环中访问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];
        }
     }
     return result;
}
相关文章: