Javascript: доступ к вложенным значениям в данных JSON с использованием имен динамических переменных - PullRequest
9 голосов
/ 13 декабря 2010

У меня есть вложенный объект 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.возраст';data [f] .type, который не будет работать.

Кто-нибудь может подсказать мне, как получить к ним доступ (получить / установить) наиболее простым и простым способом?

Примечание: я пыталсяэто и работает для get.

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

, хотя set не кажется достаточно простым.Пожалуйста, дайте мне знать, если есть лучшие решения для получения и настройки.

Ответы [ 4 ]

8 голосов
/ 13 декабря 2010

Не используйте 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;
};
8 голосов
/ 13 декабря 2010

Вы можете просто вложить скобки:

var a = 'name', b = 'heading';
data[a][b]; // = `Name`
2 голосов
/ 13 декабря 2010

Возможно, функция, которая берет путь к интересующему вас свойству и разбивает его на токены, представляющие свойства. Примерно так (конечно, очень грубо):

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);
0 голосов
/ 18 апреля 2014

При этом используется функция 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"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...