从另一个树构建递归树

Building an recursive tree from another

本文关键字:递归 构建 另一个      更新时间:2023-09-26

我在从另一个树构建递归树时遇到了一个问题。这个函数似乎可以工作,但是如果你展开第一个数组,你会注意到在索引2处有一个无穷递归。

构建树的函数:

var buildTree = function(data, idx, aparent){
  var parent = aparent || [];
  for(var i = 0, c = data.length ; i < c ; i++){
    parent.push({
      text: data[i].text,
      items: []
    });

    if(typeof data[i].items !== 'undefined' && data[i].items.length > 0){
      var t = buildTree(data[i].items, idx + 1, parent[parent.length - 1].items);
      parent[parent.length - 1].items.push(t);
    }
  }
  return parent;
};

这就是树数据的样子:

[{
  text: "house",
  groupId: "1",
  type: "group",
  items: [{
    text: "basement",
    groupId: "2",
    type: "group"
  },{
    text: "flat-1",
    groupId: "3",
    type: "group",
    items: [{
      text: "computer"
    }]
  }]
},{
  text: "other-house",
  groupId: "4",
  type: "group"
}];

我认为我做了一些事情,javascript通过引用返回值…

这是一个带有完整数据的,点击按钮后检查控制台以了解我的意思。

我实在看不懂你的代码。也许您的问题与您在递归期间传递items -数组的事实有关。

我已经修复了你的代码-使它更简单,更容易阅读。如果存在的话,它依赖于属性itemsarray,所以如果不是总是这样,您需要为这种情况添加错误处理。

function recursiveBuildTree(data) {
    var result = [];
    data.forEach(function(item) {
      var newItem = {
        text: item.text,
        items: item.items ? recursiveBuildTree(item.items) : []
      };
      result.push(newItem);
    });
    return result;
}