微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 JavaScript 在树中查找节点并获取用于查找或替换该特定对象的路径?

如何解决如何使用 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 举报,一经查实,本站将立刻删除。