0

add_child関数を適切な場所にプッシュできません。これは、私の脳に再帰の問題があるためです。私が何をする必要があるかを理解するために、親切な魂が手を貸してくれませんか?

配列の深さをグローバルに追跡してから、子を追加する必要があると思いますが、self.data[key][i].push({...});正しく取得できないようです。

これが私のjsFiddleです

それ以外の場合は、関数を呼び出していくつかのノードを追加します。

var m = new Map();
m.add(1);
m.add(2);
m.add(3);
m.add(4, 3);
m.add(5, 3);
m.add(6, 5);
m.add(7, 5);

console.log(m.data)

私が作成しようとしているものの例:

  [
      {
          node_id: 0,
          children: null
      },
      {
          node_id: 1,
          children: [
          {
              node_id: 2
              children: null
          },
          {
              node_id: 3
              children: [

          }
          ]
      },
 ]

これは私の関数呼び出し元です:

var Map = function() {

    var self = this;
    this.data = [];

    this.add = function(node_id, parent_id) {

        if (typeof parent_id == 'number') {
            self.add_child(node_id, parent_id, self.data);
            return;
        }

        self.data.push({
            'node_id': node_id,
            'children': []
        });

        return true;
    }

    this.add_child = function(node_id, needle, haystack) {

        for (var key in haystack)
        {
            if (haystack[key].children.length != 0)
            {
                self.add_child(node_id, needle, haystack[key].children);
            }
            else
            {
                if (haystack[key].node_id == needle)
                {
                    //console.log("Searching for needle: " + needle)
                    //console.log("Found it in: " + key)

                    //console.log("The Actual Data:")
                    //console.log(self.data[key]);

                    self.data[key].children.push({
                        'node_id': node_id,
                        'children': []
                    });
                    break;
                }
            }
        }
    }

};
4

2 に答える 2

1

エラーはほとんどありませんでした。これは機能するコードです。add_child 関数だけです。

this.add_child = function(node_id, needle, haystack) {
    if (!haystack) { return; }
    for (var key in haystack) {
        // you need to check if haystack[key].children is not undefined
        if (haystack[key].children && haystack[key].children.length != 0) {
            self.add_child(node_id, needle, haystack[key].children);
        } else {
            if (haystack[key].node_id == needle) {
                // initialize children if null
                if (!haystack[key].children) {
                    haystack[key].children = [];
                }
                // append to haystack
                haystack[key].children.push({
                    'node_id': node_id,
                    'children': []
                });
                break;
            }
        }
    }
};

あなたのデータでテスト済み:

var data = [
      {
          node_id: 0,
          children: null
      },
      {
          node_id: 1,
          children: [
          {
              node_id: 2,
              children: null
          },
          {
              node_id: 3,
              children: []

          }
          ]
      },
 ];

var map = new Map();
map.add_child(10, 0, data);
console.log(JSON.stringify(data));
于 2013-08-22T21:28:00.320 に答える