介绍一个函数,实现在树中寻找节点,或者叫在数组中查找下级对象。采用迭代方法,支持Typescript,提供单元测试样例。
由于我需要这么一个功能,后来搜索了Stackoverflow,根据一个网友的代码,增强了一下功能。除了复杂度有点高,其它感觉还可以,分享出来,节省大家时间。
Stackoverflow回答的地址:https://stackoverflow.com/a/67432192/8819175,核心来自Erick Petrucelli的代码。
function searchTree(
tree: Record<string, any>[],
value: unknown,
key = 'value',
withChildren = false,
) {
let result = null;
if (!Array.isArray(tree)) return result;
for (let index = 0; index < tree.length; index += 1) {
const stack = [tree[index]];
while (stack.length) {
const node = stack.shift()!;
if (node[key] === value) {
result = node;
break;
}
if (node.children) {
stack.push(...node.children);
}
}
if (result) break;
}
if (withChildren !== true) {
delete result?.children;
}
return result;
}
单元测试样例在:https://gist.github.com/aspirantzhang/a369aba7f84f26d57818ddef7d108682