从另一个构建递归树

时间:2014-07-29 17:10:32

标签: javascript recursion tree

我从另一个构建递归树时遇到问题。该函数似乎有效但如果展开第一个数组,您会注意到索引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通过引用返回值...

这是一个 plunk with the complete data ,点击按钮后查看控制台,了解我的意思。

1 个答案:

答案 0 :(得分:1)

我无法理解你的代码。也许你的问题与你在递归过程中传入items - 数组的事实有关。

我修复了你的代码 - 让它更简单易读。它依赖于items属性array(如果存在),因此如果情况并非总是如此,则需要为此方案添加错误处理。

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