簡體   English   中英

建設性地操縱未知深度的JSON樹中的任何值/對象

[英]Constructively manipulating any value/object within a JSON tree of unknown depth

我有一個包含節點和子節點的JSON樹 - 格式為:

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

我不知道這棵樹的深度,一個節點能夠讓很多孩子也有很多孩子,等等。

我的問題是我需要使用nodeID將節點添加到此樹中。 例如,可以接受nodeID和節點對象(包括其子節點)的函數將能夠替換樹中的該節點 - 結果將成為更大的樹。

我只遇到遞歸函數,允許我遍歷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樹的值?

提前致謝

如果要像您所說的那樣修改節點,則只需修改該節點的屬性即可。

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;
   }
}

那不是JSON ,它是一個Javascript對象文字。 JSON是將簡單的Javascript對象編碼為字符串的某種方式; 你的例子不是那樣寫的。 此外,您的代碼不會操縱JSON對象(實際上是字符串,而不是對象); 它操縱Javascript對象(這是一種更簡單的任務)。

也就是說,我不確定你的實際問題是什么,但如果是關於向children數組添加新元素,你可以使用Array.push

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

(這假設findNode.find實際上有效,我很確定它沒有。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM