如何解决如何使用 JavaScript 在树中查找节点并获取用于查找或替换该特定对象的路径?
我有一个对象字面量,它本质上是一棵没有固定层数的树。如何在树中搜索特定节点,然后在 javascript 中以有效方式找到该节点时返回该节点?
基本上我有一个这样的树,想找到标题为“randomNode_1”的节点并返回 data[0].children[0].children[0]
或单独搜索返回 .children[0].children[0]
或者只是替换搜索过程中找到的对象的简单方法。
var data = [
{
title: 'topNode',children: [
{
title: 'node1',children: [
{
title: 'randomNode_1'
},{
title: 'node2',children: [
{
title: 'randomNode_2',children:[
{
title: 'node2',children: [
{
title: 'randomNode_3',}]
}
]
}]
}]
}
]
}];
解决方法
您可以使用递归生成器函数...
这个例子很简单但很强大:
var data = [{ title: 'topNode',children: [{ title: 'node1',children: [{ title: 'randomNode_1' },{ title: 'node2',children: [{ title: 'randomNode_2',children: [{ title: 'node2',children: [{ title: 'randomNode_3',}] }] }] }] }] }];
function* findAllNode(child,title) {
for (const node of child) {
if (node.title === title)
yield node;
if (node.children)
yield* findAllNode(node.children,title);
}
}
for (const node of findAllNode(data,"randomNode_1")) {
node.msg = "Hello,World"; // Modify node
break; // Get Only first matched node;
}
// Return All Node
console.log([...findAllNode(data,"randomNode_1")])
这是经过修改的,也支持节点索引(键):
var data = [{ title: 'topNode',}] }] }] }] }] }];
let findByIndex = (data,keys) => keys.reduce((o,k) => o[k],data);
function* findAllNode(child,title) {
for (let i = 0; i < child.length; i++) {
const node = child[i];
if (node.title === title)
yield [node,[i]];
if (node.children) for (const unit of findAllNode(node.children,title)) {
unit[1].unshift(i,"children");
yield unit
}
}
}
for (const [node,index] of findAllNode(data,"randomNode_1")) {
console.log("findByIndex",findByIndex(data,index))
node.msg = "Hello,World"; // Modify node
break; // Get Only first matched node;
}
console.log("Find All Node ",[...findAllNode(data,"randomNode_1")])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。