Пройдите по всем узлам дерева объектов JSON с помощью JavaScript - PullRequest
134 голосов
/ 06 апреля 2009

Я бы хотел просмотреть дерево объектов JSON, но не могу найти для этого никакой библиотеки. Это не кажется сложным, но кажется, что изобретать велосипед заново.

В XML так много учебных пособий, показывающих, как обходить дерево XML с помощью DOM: (

Ответы [ 15 ]

0 голосов
/ 28 февраля 2017

Мой сценарий:

op_needed = [];
callback_func = function(val) {
  var i, j, len;
  results = [];
  for (j = 0, len = val.length; j < len; j++) {
    i = val[j];
    if (i['children'].length !== 0) {
      call_func(i['children']);
    } else {
      op_needed.push(i['rel_path']);
    }
  }
  return op_needed;
};

Ввод JSON:

[
    {
        "id": null, 
        "name": "output",   
        "asset_type_assoc": [], 
        "rel_path": "output",
        "children": [
            {
                "id": null, 
                "name": "output",   
                "asset_type_assoc": [], 
                "rel_path": "output/f1",
                "children": [
                    {
                        "id": null, 
                        "name": "v#",
                        "asset_type_assoc": [], 
                        "rel_path": "output/f1/ver",
                        "children": []
                    }
                ]
            }
       ]
   }
]

Вызов функции:

callback_func(inp_json);

Вывод в соответствии с моей потребностью:

["output/f1/ver"]
0 голосов
/ 14 февраля 2017

Я создал библиотеку для обхода и редактирования глубоко вложенных объектов JS. Проверьте API здесь: https://github.com/dominik791

Вы также можете поиграть с библиотекой в ​​интерактивном режиме, используя демонстрационное приложение: https://dominik791.github.io/obj-traverse-demo/

Примеры использования: У вас всегда должен быть корневой объект, который является первым параметром каждого метода:

var rootObj = {
  name: 'rootObject',
  children: [
    {
      'name': 'child1',
       children: [ ... ]
    },
    {
       'name': 'child2',
       children: [ ... ]
    }
  ]
};

Вторым параметром всегда является имя свойства, которое содержит вложенные объекты. В приведенном выше случае это будет 'children'.

Третий параметр - это объект, который вы используете для поиска объекта / объектов, которые вы хотите найти / изменить / удалить. Например, если вы ищете объект с идентификатором, равным 1, вы передадите { id: 1} в качестве третьего параметра.

И вы можете:

  1. findFirst(rootObj, 'children', { id: 1 }) чтобы найти первый объект с id === 1
  2. findAll(rootObj, 'children', { id: 1 }) чтобы найти все объекты с id === 1
  3. findAndDeleteFirst(rootObj, 'children', { id: 1 }) для удаления первого соответствующего объекта
  4. findAndDeleteAll(rootObj, 'children', { id: 1 }) для удаления всех подходящих объектов

replacementObj используется в качестве последнего параметра в двух последних методах:

  1. findAndModifyFirst(rootObj, 'children', { id: 1 }, { id: 2, name: 'newObj'}) для изменения первого найденного объекта с id === 1 на { id: 2, name: 'newObj'}
  2. findAndModifyAll(rootObj, 'children', { id: 1 }, { id: 2, name: 'newObj'}) для изменения всех объектов с id === 1 на { id: 2, name: 'newObj'}
0 голосов
/ 21 июня 2016
             var localdata = [{''}]// Your json array
              for (var j = 0; j < localdata.length; j++) 
               {$(localdata).each(function(index,item)
                {
                 $('#tbl').append('<tr><td>' + item.FirstName +'</td></tr>);
                 }
0 голосов
/ 06 августа 2015

Вы можете получить все ключи / значения и сохранить иерархию с помощью этого

// get keys of an object or array
function getkeys(z){
  var out=[]; 
  for(var i in z){out.push(i)};
  return out;
}

// print all inside an object
function allInternalObjs(data, name) {
  name = name || 'data';
  return getkeys(data).reduce(function(olist, k){
    var v = data[k];
    if(typeof v === 'object') { olist.push.apply(olist, allInternalObjs(v, name + '.' + k)); }
    else { olist.push(name + '.' + k + ' = ' + v); }
    return olist;
  }, []);
}

// run with this
allInternalObjs({'a':[{'b':'c'},{'d':{'e':5}}],'f':{'g':'h'}}, 'ob')

Это модификация (https://stackoverflow.com/a/25063574/1484447)

0 голосов
/ 31 июля 2015

Лучшим решением для меня было следующее:

просто и без использования каких-либо рамок

    var doSomethingForAll = function (arg) {
       if (arg != undefined && arg.length > 0) {
            arg.map(function (item) {
                  // do something for item
                  doSomethingForAll (item.subitem)
             });
        }
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...