86.树型结构进行过滤的函数
题目描述
实现一个对树型结构进行过滤的函数,其中树形结构的格式如下:
tree = [
{ name: "A" },
{ name: "B", children: [{ name: "A" }, { name: "D", children: [] }] },
{ name: "C" },
];
要求:实现该函数,要求不允许对原有的 tree 做任何修改,最终返回结果是一棵新结构出来的树
示例
- 假设我输入的 filterName 为 A 则过滤后返回的结果为
[{ name: "A" }, { name: "B", children: [{ name: "A" }] }];
- 假设我输入的 filterName 为 B 则过滤后返回的结果为
[{ name: "B", children: [{ name: "A" }, { name: "D", children: [] }] }];
- 假设我输入的 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"));