Javascript:使用动态变量名访问JSON数据中的嵌套值

Javascript:使用动态变量名访问JSON数据中的嵌套值,javascript,json,variables,nested,Javascript,Json,Variables,Nested,我有一个嵌套的Javascript对象,比如 var data = { 'name': { 'heading': 'Name', 'required': 1, 'type': 'String' }, 'profile': { 'age': { 'heading': 'Age', 'required': 0, 'type': 'Number' }, 'phone': { 'heading':

我有一个嵌套的Javascript对象,比如

var data = { 'name':    { 'heading': 'Name', 'required': 1, 'type': 'String' },
             'profile': {
                  'age':   { 'heading': 'Age', 'required': 0, 'type': 'Number' },
                  'phone': { 'heading': 'Phone', 'required': 0, 'type': 'String'},
                  'city':  { 'heading': 'City', 'required': 0, 'type': 'String'},
                  },
             'status':  { 'heading': 'Status', 'required': 1, 'type': 'String' }
           };
在这里,我可以访问data.profile.age.type或data.name.type字段。没问题 如果我有动态变量名,我可以访问如下。同样,没有问题

f = 'profile'; data[f].age.type
但是,这里我有变量名,比如'name'、'profile.age'、'profile.city'等等,显然我不能以f='profile.age'的形式访问它们;数据[f]。键入将不起作用的数据

有谁能指导我如何以最直接、最简单的方式访问它们(get/set)

注意:我试过这个,它对get有效

data.get = function(p) { o = this; return eval('o.'+p); };
f = 'profile.age'; data.get(f).name;

虽然设置似乎不够简单。如果还有更好的get和set解决方案,请告诉我。

您可以将括号嵌套起来:

var a = 'name', b = 'heading';
data[a][b]; // = `Name`

可能是一个函数,它接受您感兴趣的属性的路径,并将其分解为表示属性的标记。类似这样(当然,这很粗糙):


除非绝对必要,否则不要使用
eval
。)至少在这种情况下,有更好的方法可以做到这一点——您可以将嵌套名称拆分为单独的部分,并对其进行迭代:

data.get = function(p) {
  var obj = this;

  p = p.split('.');
  for (var i = 0, len = p.length; i < len - 1; i++)
    obj = obj[p[i]];

  return obj[p[len - 1]];
};

data.set = function(p, value) {
  var obj = this;

  p = p.split('.');
  for (var i = 0, len = p.length; i < len - 1; i++)
    obj = obj[p[i]];

  obj[p[len - 1]] = value;
};
data.get=函数(p){
var obj=这个;
p=p.split('.');
对于(变量i=0,len=p.length;i
这使用jquery.each()函数,使用可能包含或不包含一个或多个“.”的字符串变量遍历json树。您也可以传入一个数组并省略.split()

pathString=类似于“person.name”

jsonObj=类似于{“person”:{“name”:“valerie”}


返回“valerie”

访问/设置嵌套值的干净方法是在ES6中使用
reduce

const x=['a','b','c'],o={a:{b:{c:'tigerking'}}
//获取值:“虎王”
log(x.reduce((a,b)=>a[b],o))
//设定值:
x、 切片(0,x.length-1)。减少((a,b)=>a[b],o)[x[x.length-1]='blossom'

log(o)/{a:{b:{c:'blossom'}}}}
你这样问这个问题是对的。每当你发现自己在Javascript中使用eval时,你几乎肯定做了错事。谢谢你让我知道eval。可能是eval是邪恶的!:-)你说对了。看看这里最后的建议:谢谢。响应速度非常快,而且非常有用。@vsync:当然可以。我说的不是
var a='name.heading';数据[a]
,您可以使用连续的括号组访问对象的更深层次。因此,如果您知道您正在
profile
对象中查找某些内容,
var a='profile',b='age';数据[a][b]
有效。显然,如果需要处理任意字符串,其他答案将说明如何处理。如果有人不需要解析任意
“a.b.c.d”
字符串的复杂性,这是一种替代方法。
   var f = 'one.two';
   var data = { one: {two:'hello'}};
   data.get = /* same as above */;

   var val = data.get(f);
data.get = function(p) {
  var obj = this;

  p = p.split('.');
  for (var i = 0, len = p.length; i < len - 1; i++)
    obj = obj[p[i]];

  return obj[p[len - 1]];
};

data.set = function(p, value) {
  var obj = this;

  p = p.split('.');
  for (var i = 0, len = p.length; i < len - 1; i++)
    obj = obj[p[i]];

  obj[p[len - 1]] = value;
};
function getGrandchild(jsonObj, pathString){
    var pathArray = pathString.split(".");
    var grandchild = jsonObj;
    $.each(pathArray, function(i, item){
        grandchild = grandchild[item];
    });
    return grandchild;
};