js给一个树形数据中所有没有 children属性的节点都添加一个空的children数组

假设您要给一个树形数据中所有没有 children 属性的节点都添加一个空的 children 数组,可以使用递归函数来实现。算法大致步骤如下:

  1. 定义递归函数 addChildrenToTree(root),其中 root 表示当前节点。
  2. 在函数内部,首先判断 root 是否为空,是则直接返回。
  3. 然后,判断 root 是否已经具有 children 属性,有则递归调用 addChildrenToTree 函数,传入 root 的每个子元素。
  4. 如果 root 没有 children 属性,则向其添加一个空数组 []。然后递归调用 addChildrenToTree 函数,传入 root.children 中的每个子元素。
  5. 递归结束后,返回 root

实现代码如下:

function addChildrenToTree(root) {
  if (!root) {
    return;
  }
  if (root.children && Array.isArray(root.children)) {
    root.children.forEach(child => {
      addChildrenToTree(child);
    });
  } else {
    root.children = [];
    if (root.children && Array.isArray(root.children)) {
      root.children.forEach(child => {
        addChildrenToTree(child);
      });
    }
  }
  return root;
}

在上述代码中,假设原始的树形数据结构为:

const data = {
  name: 'root',
  children: [
    {
      name: 'node1',
      children: [
      ]
    },
    {
      name: 'node2'
    }
  ]
};

然后,调用函数 addChildrenToTree 并传入根节点:

const result = addChildrenToTree(data);

则会针对树形数据中的每个节点都添加一个空的 children 数组,最终结果如下:

{
  "name": "root",
  "children": [
    {
      "name": "node1",
      "children": []
    },
    {
      "name": "node2",
      "children": []
    }
  ]
}

可以看到,原来没有 children 属性的节点 node2,也被添加了一个空的 children 数组。

如果数据是数组

假设您想要给一个树形数组数据中所有没有 children 属性的元素都添加一个空的 children 数组,可以使用递归函数来实现。算法大致步骤如下:

  1. 定义递归函数 addChildrenToTree(data),其中 data 表示当前处理的数组。
  2. 在函数内部,循环遍历每个元素,判断其是否具有 children 属性。
  3. 如果有,则递归调用 addChildrenToTree 函数,传入当前元素的 children 属性。
  4. 如果没有 children 属性,则向其添加一个空数组 [],表示该元素的子元素集合。然后递归调用 addChildrenToTree 函数,传入新添加的空数组。
  5. 递归结束后,返回 data

实现代码如下:

function addChildrenToTree(data) {
  data.forEach(item => {
    if (item.children && Array.isArray(item.children)) {
      addChildrenToTree(item.children);
    } else {
      item.children = [];
      addChildrenToTree(item.children);
    }
  });
  return data;
}