javascript - javascript数组树搜索保留节点和父母
问题描述
尝试实现一个采用数组(树结构)和字符串关键字的树搜索函数,将返回一个树数组,但只保留匹配的节点及其父节点。
function search(nodes, keyword){
}
const nodes = [
{
value: "1-1",
children: [
{ value: "1-1-1"},
{ value: "1-1-2", children:[
{
value: "1-1-2-1",
children: [
{ value: "1-1-2-1-1" },
{ value: "1-1-2-1-2" }
]
},
{
value: "1-1-2-2"
}
] }
]
},
{
value: "1-2",
children: [
{ value: "1-2-1"},
{ value: "1-2-2", children:[
{
value: "1-2-2-1",
children: [
{ value: "1-2-2-1-1" },
{ value: "1-2-2-1-2" }
]
},
{
value: "1-2-2-2"
}
] }
]
},
];
预期输出将是一棵树,其节点值包含“1-1-2-1”,其父级如下
const searchedNodes = search(nodes, "1-1-2-1");
[
{
value: "1-1",
children: [
{ value: "1-1-2", children:[
{
value: "1-1-2-1",
children: [
{ value: "1-1-2-1-1" }
]
}
] }
]
}
]
*/
2018-06-26 更新
我做了一个工作(DFS),但可能效率不高。
const search = (nodes, keyword) => {
let newNodes = [];
for (let n of nodes) {
if (n.children) {
const nextNodes = this.keywordFilter(n.children, keyword);
if (nextNodes.length > 0) {
n.children = nextNodes;
} else if (n.label.toLowerCase().includes(keyword.toLowerCase())) {
n.children = nextNodes.length > 0 ? nextNodes : [];
}
if (
nextNodes.length > 0 ||
n.label.toLowerCase().includes(keyword.toLowerCase())
) {
newNodes.push(n);
}
} else {
if (n.label.toLowerCase().includes(keyword.toLowerCase())) {
newNodes.push(n);
}
}
}
return newNodes;
};
解决方案
您需要迭代同一级别的节点并检查值是否相等,然后获取该节点并退出循环。否则检查孩子并生成一个新对象以防止改变原始数据。
function search(nodes, value) {
var result;
nodes.some(o => {
var children;
if (o.value === value) {
return result = o;
}
if (o.children && (children = search(o.children, value))) {
return result = Object.assign({}, o, { children });
}
});
return result && [result];
}
const nodes = [{ value: "1-1", children: [{ value: "1-1-1" }, { value: "1-1-2", children: [{ value: "1-1-2-1", children: [{ value: "1-1-2-1-1" }, { value: "1-1-2-1-2" }] }, { value: "1-1-2-2" }] }] }, { value: "1-2", children: [{ value: "1-2-1" }, { value: "1-2-2", children: [{ value: "1-2-2-1", children: [{ value: "1-2-2-1-1" }, { value: "1-2-2-1-2" }] }, { value: "1-2-2-2" }] }] }];
console.log(search(nodes, "1-1-2-1"));
.as-console-wrapper { max-height: 100% !important; top: 0; }
推荐阅读
- javascript - 带有 sinon 和 proxyquire 的存根依赖函数不打印存根结果
- android - 错误:java.lang.ArrayIndexOutOfBoundsException?
- python - Hover functionality matplotlib graph in tkinter
- python - QML 嵌套矩形
- javascript - 有没有办法在 Javascript 中编写像 toString 这样的 Java 方法,如果在方法上调用该方法会打印该方法的源代码?
- python - Converting pk to slug with Django-Generic-Detail view
- git - 如果远程分支不等于给定的提交 ID,则用于中止的 Git 推送选项?
- go - Golang reverse a arbitrary slice
- java - 如何将 Ints 读取为数组并输出 MinMax
- javascript - ReferenceError: FormData is not defined at Object.