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

rsm*_*thy 10 javascript variables json nested

我有一个嵌套的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' }
           };
Run Code Online (Sandbox Code Playgroud)

在这里,我可以访问data.profile.age.type或data.name.type这些字段.没有问题如果我有动态变量名称,我可以访问如下.再一次,没问题.

f = 'profile'; data[f].age.type
Run Code Online (Sandbox Code Playgroud)

但是,这里我有变量名称,如'name','profile.age','profile.city'等,显然我无法访问它们,因为f ='profile.age'; 数据[f] .type不起作用.

谁能指导我如何以最直接和简单的方式访问它们(获取/设置)?

注意:我试过这个,它适用于get.

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

虽然设置似乎不够简单.如果有更好的获取和设置解决方案,请告诉我.

jos*_*736 8

你可以嵌套括号:

var a = 'name', b = 'heading';
data[a][b]; // = `Name`
Run Code Online (Sandbox Code Playgroud)


cas*_*nca 8

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;
};
Run Code Online (Sandbox Code Playgroud)