代码之家  ›  专栏  ›  技术社区  ›  24sharon

JavaScript:在递归树中查找元素的所有父级

  •  4
  • 24sharon  · 技术社区  · 6 年前

    var datas = {
        'tree': [
            {
                'name': 'name1',
                'tree': [
                    {'name': 'name2'},
                    {'name': 'name3'},
                    {
                        'name': 'name4',
                        'tree': [
                            {'name': 'name5'},
                            {'name': 'name6'}
                        ]
                    },
                    {'name': 'name7'}
                ]
            },
            {
                'name': 'name8',
                'tree': [
                    {'name': 'name9'}
                ]
            }
        ]
    }
    

    我要找到指定id的所有父母

    例如,在树演示中,如果我查找'name5',我希望找到“name1,name4,name5”

    这是我的密码

     keys: string[];
      pathFound: boolean = false;
     getLevel(event: iEventBase, id: string, path: string[]): void {
        if (this.pathFound) return;
        event.content.forEach((key) => {
          if (key.id == id) {
            if(!path){
              path =  [];;
            }
            path.push(key.id);
            this.keys = path;
            this.pathFound = true;
            return;
          }
          if (key.type === "page") {
            if(!path){
              path = [];
            }
            path.push(key.id);
            this.getLevel(key, id, path);
          }
        })
      }
    }
    this.getLevel(state.mainEvent.content.page, event.id, null);
    
    2 回复  |  直到 6 年前
        1
  •  7
  •   Nina Scholz    5 年前

    您可以通过检查名称来使用递归方法,并返回一个新的数据结构,其中只包含所需对象的节点。

    function find({ tree = [], ...object }, name) {
        var result;
        if (object.name === name) return object;
        return tree.some(o => result = find(o, name)) && Object.assign({}, object, { tree: [result] });
    }
    
    var datas = { tree: [{ name: 'name1', tree: [{ name: 'name2' }, { name: 'name3' }, { name: 'name4', tree: [{ name: 'name5' }, { name: 'name6' }] }, { name: 'name7' }] }, { name: 'name8', tree: [{ name: 'name9' }] }] };
    
    console.log(find(datas, 'name5'));
    .as-console-wrapper { max-height: 100% !important; top: 0; }
        2
  •  4
  •   Dacre Denny    6 年前

    也许你可以用递归的方法来解决这个问题。这里的基本思想是在树中查找一个节点,该节点的名称与您要查找父节点的节点名称相匹配(即 name5

    一旦找到这样一个节点,就返回一个数组,将相应的父节点名附加到数组中,直到递归完全展开。

    var datas = {
        'tree': [
            {
                'name': 'name1',
                'tree': [
                    {'name': 'name2'},
                    {'name': 'name3'},
                    {
                        'name': 'name4',
                        'tree': [
                            {'name': 'name5'},
                            {'name': 'name6'}
                        ]
                    },
                    {'name': 'name7'}
                ]
            },
            {
                'name': 'name8',
                'tree': [
                    {'name': 'name9'}
                ]
            }
        ]
    }
    
    function findParents(node, searchForName) {
    
      // If current node name matches the search name, return
      // empty array which is the beginning of our parent result
      if(node.name === searchForName) {
        return []
      }
      
      // Otherwise, if this node has a tree field/value, recursively
      // process the nodes in this tree array
      if(Array.isArray(node.tree)) {
      
        for(var treeNode of node.tree) {
    
          // Recursively process treeNode. If an array result is
          // returned, then add the treeNode.name to that result
          // and return recursively
          const childResult = findParents(treeNode, searchForName)
    
          if(Array.isArray(childResult)) {
            return [ treeNode.name ].concat( childResult );
          }
        }
      }
    }
    
    console.log( findParents(datas, 'name5') )