题目:实现一个对树型结构进行过滤的函数,其中树形结构的格式如下: tree = [ {name: ‘A’}, {name: ‘B’,
children: [ {name: ‘A’}, {name: ‘AA’, children: […]} ]}, {name: ‘C’}
]
假设我输入的 str 为 A 则过滤后返回的结果为 [ {name: ‘A’}, {name: ‘B’, children: [ {name: ‘A’} ]} ]
假设我输入的 str 为 AA 则过滤后返回的结果为 [ {name: ‘B’, children: [ {name: ‘AA’, children: […]} ]} ]
假设我输入的 str 为 B 则过滤后返回的结果为 [ {name: ‘B’, children: [ {name: ‘A’}, {name: ‘AA’, children: […]} ]} ]
// 实现该函数,要求不允许对原有的tree做任何修改,最终返回结果是一棵新结构出来的树 function filter (tree, str) {}
const tree = [
{ name: "A" },
{ name: "B", children: [{ name: "A" }] },
{
name: "AA",
children: [
{ name: "BB" },
{ name: "C" },
{ name: "D", children: [{ name: "A" }] },
{ name: "A" },
],
},
{ name: "D", children: [{ name: "C", children: [{ name: "AA" }] }] },
];
function clear(tree, str) {
if (!tree) return [];//处理叶节点
let result = [];
tree.map((item) => {
let it = { ...item }; //每项浅拷贝一下保证不影响原来的tree
if (it.name === str) {
result.push(it);
} else {
let obj = clear(it.children, str);
//得到children的返回的result数组,放到拷贝对象的children中
if (obj.length > 0) {
it.children = obj;
result.push(it);
}
}
});
return result;//每层返回一个数组
}
console.log(clear(tree, "A"));
console.log(tree);