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

2

如果您删除 else 条件,它应该可以解决问题,而不是世界上最有效的事情,因为您将走大部分树,这样的事情最好用二叉搜索树完成,例如红黑树

http://jsfiddle.net/vhqxk/

        for (var key in haystack)
        {
            if (haystack[key].children.length != 0)
            {
                self.add_child(node_id, needle, haystack[key].children);
            }

            if (haystack[key].node_id == needle)
            {                    
                haystack[key].children.push({
                    'node_id': node_id,
                    'children': []
                });
                break;
            }
        }
于 2013-08-22T21:31:21.913 回答
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 回答