2010-09-13 55 views
3

的JSON樹內的任何值/對象我有一個包含節點和兒童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樹的價值?

在此先感謝

+0

嗨,@TJCrowder,'jsonObject'不是一個json,它是一個js對象。 – 2013-03-20 06:04:53

+0

@ Joe.wang:我知道。 (事實上​​,這是我的寵兒之一)我認爲你打算在丹指導。 – 2013-03-20 11:53:46

回答

1

如果要修改一個節點,就像你說的,你可以修改該節點的屬性。

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

['jQuery.each'](http://api.jquery.com/jQuery.each/)(又名''.each')是一個實用函數,當你使用時它基本上是'for..in'的便捷包裝將它應用於不是數組的對象。完全不同於jQuery *實例*的['each'](http://api.jquery.com/each/)方法。如果OP使用jQuery來做其他事情,那麼使用便捷函數也不會有任何傷害(除了涉及到的所有函數調用)。 – 2010-09-13 17:41:38

+0

@ T.J。 Crowder:是的。但爲什麼他將'jsObj'轉換爲jQuery對象? jQuery集合和方法通常用於DOM元素 - 必須有更好的方法。 – 2010-09-13 17:44:27

+0

我剛剛發現我使用的所有變量都是指向JSON樹的指針 - 所以findNode.node實際上是樹中的節點! – 2010-09-13 18:20:55

1

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

這就是說,我不知道您的實際問題是什麼,但如果它是關於增加新的元素到children數組,你可以使用Array.push

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

(假設findNode.find實際作品,我很肯定它沒有。)

+0

findNode。find()確實起作用,並且我剛剛使用了使用.children.push(child)的建議 - 它已成功修改了我的JSON樹。謝謝 – 2010-09-13 18:21:54