Конструктивно манипулировать любым значением / объектом в дереве JSON неизвестной глубины - PullRequest
3 голосов
/ 13 сентября 2010

У меня есть дерево JSON, которое содержит узлы и дочерние элементы - формат:

jsonObject = 
{
  id:nodeid_1,
  children: [
  {
    id:nodeid_2,
    children:[]
  },
  {
    id:nodeid_3,
    children:[
    {
      id:nodeid_4,
      children:[]
    },
    {
      id:nodeid_5,
      children:[]
    }
  }
}

Я не знаю глубину этого дерева, узел может иметь много дочерних элементов, которые также имеют многодети и т. д.

Моя проблема заключается в том, что мне нужно добавить узлы в это дерево с помощью ID узла.Например, функция, которая может принимать идентификатор узла и объект узла (включая его дочерние элементы), сможет заменить этот узел в дереве, что в результате станет большим деревом.

У меня есть тольконатолкнуться на рекурсивные функции, которые позволяют мне проходить все узлы в дереве JSON, и изменение, которое я внес в одну из этих функций, возвращает мне объект узла - но это не помогает, так как мне нужно изменить исходное дерево:

var findNode = {
node:{},
find:function(nodeID,jsonObj) {
    if( typeof jsonObj == "object" ) {
        $.each(jsonObj, function(k,v) {
            if(v == nodeID) {
                findNode.node = $(jsonObj).eq(0).toArray()[0];        
            } else {
                findNode.find(nodeID,v); 
            }
        });
    } else {
        //console.log("jsobObj is not an object");
    }
  }
}

, который позволяет мне выполнить следующий тест:

findNode.find("nodeid_3",json);
alert(findNode.node);

Итак, подведем итог - как я могу изменить значение дерева JSON с неизвестной глубиной?

Заранее спасибо

Ответы [ 2 ]

1 голос
/ 13 сентября 2010

Это не JSON , это литерал объекта Javascript. JSON - это определенный способ кодирования простого объекта Javascript в строку; твой пример написан не так. Кроме того, ваш код не манипулирует объектами JSON (которые на самом деле являются строками, а не объектами); он манипулирует объектами Javascript (что намного проще).

Тем не менее, я не уверен, каков ваш настоящий вопрос, но если речь идет о добавлении новых элементов в массив children, вы можете использовать Array.push :

findNode.find("nodeid_3",json);
findNode.node.children.push(child);

(Предполагается, что findNode.find действительно работает, что, я уверен, не работает.)

1 голос
/ 13 сентября 2010

Если вы хотите изменить узел, как вы сказали, вы можете просто изменить свойства этого узла.

var node = findNode.find("nodeid_3",json);
node.id = "nodeid_3_modified";
node.children = [];

Кроме того, почему вы используете для этого jQuery?

Вот альтернатива без использования jQuery должна работать:

function findNode(object, nodeId) {
   if (object.id === nodeId) return object;

   var result;
   for (var i = 0; i < object.children.length; i++) {
      result = findNode(object.children[i], nodeId);
      if (result !== undefined) return result;
   }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...