Javascript 树结构到数组的转换

标签 javascript

我正在处理 TreeView ,并构建了一个简单的节点类:它由一个名称和一个子级数组组成:

class Node {
  constructor(name, childNodes) {
    this.name = name;
    this.childNodes = childNodes;
  }
}

现在我的目标是创建一个返回这样的对象的函数:

var tree = [
  {
    text: 'Parent 1',
    nodes: [
      {
        text: 'Child 1',
        nodes: [
          {
            text: 'Grandchild 1'
          }
        ]
      },
      {
        text: 'Child 2'
      }
    ]
  },
  {
    text: 'Parent 2'
  },
];

我尝试使用递归方法。它从一个空数组开始并添加子数组,直到没有剩余数组为止:

function recTreeview(currentNode, treeview) {
  var tempChildren = [];
  currentNode.childNodes.forEach(child => {
    tempChild.push(recTreeview(child, treeview));
  });
  return treeview.push({
    text: currentNode.name,
    nodes: tempChildren
  })
}

但是递归 Treeview 函数的某些部分一定是错误的。当我创建树并尝试在 chrome 开发控制台中打开它时,它只显示“5”,而不是 (5) [{…}, {…}, {…}, {…}, {…} ]。我做错了什么?

tree = recTreeview(parent, []);
tree;

最佳答案

您返回的是push的结果,而不是实际的treeview

根据 Array.prototype.push() docs

Return value
The new length property of the object upon which the method was called.


因此,不要返回treeview.push(...),而是treeview.push(...),然后返回treeview

function recTreeview(currentNode, treeview) {
  var tempChildren = [];
  currentNode.childNodes.forEach(child => {
    tempChild.push(recTreeview(child, treeview));
  });
  treeview.push({
    text: currentNode.name,
    nodes: tempChildren
  });

  return treeview;
}

关于Javascript 树结构到数组的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50019318/

相关文章:

JavaScript : Merge two arrays into one

javascript - 脚本5007 : Unable to get value of the property 'refresh' : object is null or undefined

javascript - 自动完成 (jQuery UI) 和本地存储

javascript - 使用 Javascript 设置 HTML <span> 的内容

javascript - 如何访问symfony2中另一个html.twig文件中的javascript函数?

javascript - 如何为速度计创建 jquery 插件

javascript - 将禁用添加到 div 类

javascript - 获取 html5 Canvas 上每个绘制矩形的特定颜色

javascript - Angularjs - 使用 $scope 值加载 JSON 数据(动态)返回未定义

javascript - 如何使用 javascript 每 X 秒刷新一次浏览器?