3

ノードと子を含む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ツリー内のすべてのノードをトラバースできる再帰関数に出くわしただけで、これらの関数の1つを変更すると、ノードオブジェクトが返されますが、元のツリーを変更する必要があるため、役に立ちません。 :

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ツリーの値を変更するにはどうすればよいですか?

前もって感謝します

4

2 に答える 2

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;
   }
}
于 2010-09-13T17:32:59.713 に答える
1

これはJSONではなく、Javascriptオブジェクトリテラルです。JSONは、単純なJavascriptオブジェクトを文字列にエンコードする特定の方法です。あなたの例はそのように書かれていません。また、コードはJSONオブジェクト(実際にはオブジェクトではなく文字列)を操作しません。Javascriptオブジェクトを操作します(これははるかに簡単なタスクです)。

そうは言っても、実際の質問が何であるかはわかりませんが、children配列に新しい要素を追加する場合は、 Array.pushを使用できます。

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

(これは、findNode.findが実際に機能することを前提としていますが、実際には機能しないと確信しています。)

于 2010-09-13T17:50:17.993 に答える