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

时间:2010-12-13 17:32:27

标签: javascript json variables 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' }
           };

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

f = 'profile'; data[f].age.type

但是,我在这里有变量名称,如'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;

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

5 个答案:

答案 0 :(得分:8)

您可以嵌套括号:

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

答案 1 :(得分:7)

除非绝对必要,否则请勿使用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;
};

答案 2 :(得分:2)

也许是一个函数,它接受你感兴趣的属性的路径,并将其分解为表示属性的标记。这样的事情(当然这非常粗糙):

data.get = function(path) {
  var tokens = path.split('.'), val = this[tokens[0]];
  if (tokens.length < 2) return val;
  for(var i = 1; i < tokens.length; i++) {
     val = val[tokens[i]];
  }
  return val;
}

示例:

   var f = 'one.two';
   var data = { one: {two:'hello'}};
   data.get = /* same as above */;

   var val = data.get(f);

答案 3 :(得分:1)

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

const x = ['a', 'b', 'c'], o = {a: {b: {c: 'tigerking'}}}

// Get value: "tigerking"
console.log(x.reduce((a, b) => a[b], o)) 

// Set value: 
x.slice(0, x.length-1).reduce((a, b) => a[b], o)[x[x.length-1]] = 'blossom'

console.log(o) // {a: {b: {c: 'blossom'}}}

因此,您可以先使用'profile.age'将变量'profile.age'.split('.')转换为数组,然后使用上述方法。

答案 4 :(得分:0)

这使用jquery.each()函数使用字符串变量遍历json树,该变量可能包含也可能不包含一个或多个“。”。您也可以传入一个数组并省略.split();

pathString =类似“person.name”

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

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

返回“valerie”

相关问题