86.树型结构进行过滤的函数

书诚小驿2025/07/08前端面经算法Javascript

题目描述

实现一个对树型结构进行过滤的函数,其中树形结构的格式如下:

tree = [
  { name: "A" },
  { name: "B", children: [{ name: "A" }, { name: "D", children: [] }] },
  { name: "C" },
];

要求:实现该函数,要求不允许对原有的 tree 做任何修改,最终返回结果是一棵新结构出来的树

示例

  1. 假设我输入的 filterName 为 A 则过滤后返回的结果为
[{ name: "A" }, { name: "B", children: [{ name: "A" }] }];
  1. 假设我输入的 filterName 为 B 则过滤后返回的结果为
[{ name: "B", children: [{ name: "A" }, { name: "D", children: [] }] }];
  1. 假设我输入的 filterName 为 D 则过滤后返回的结果为
[{ name: "B", children: [{ name: "D", children: [] }] }];

错误解法

let tree = [
  { name: "A" },
  { name: "B", children: [{ name: "A" }, { name: "D", children: [] }] },
  { name: "C" },
];
function filter(tree, filterName) {
  let newTree = [];
  let tree1;
  let tree2;
  tree1 = tree.filter((item) => item.name === filterName);
  for (let i = 0; tree.length - 1; i++) {
    if (tree[i].children && tree[i].children.length > 0) {
      tree2 = filter(tree[i].children, filterName);
    }
    newTree.concat(tree1, tree2);
  }
}
console(filter(tree));

参考答案

DETAILS
let tree = [
  { name: "A" },
  { name: "B", children: [{ name: "A" }, { name: "D", children: [] }] },
  { name: "C" },
];
function filter(tree, filterName) {
  if (!tree || tree.length === 0) return [];
  let result = [];
  for (const node of tree) {
    if (node.name === filterName) {
      result.push(deepClone(node));
    } else if (node.children && node.children.length > 0) {
      let filterChildren = filter(node.children, filterName);
      if (filterChildren.length > 0) {
        result.push({
          name: node.name,
          children: node.children,
        });
      }
    }
  }
  return result;
}
function deepClone(node) {
  let newNode = { name: node.name };
  if (newNode.children && newNode.children.length > 0) {
    newNode.children = node.children.map((child) => deepCopyNode(child));
  }
  return newNode;
}
console.log(filter(tree, "A"));
最后更新时间' 2025/7/9 01:40:10