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

时间:2018-11-13 08:59:18

标签: javascript recursion tree

我有一棵这样的树

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”

我写了这段代码,但结果错误,我得到了其他元素的ID,而不仅仅是父元素

这是我的代码

 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 个答案:

答案 0 :(得分:2)

您可以使用递归方法来检查名称,然后在数组中返回名称,或者通过再次调用该函数来返回对象的路径。

function find(array, name) {
    var result;
    array.some(o => {
        var temp;
        if (o.name === name) {
            return result = [name];
        }
        temp = find(o.tree || [], name);
        if (temp) {
            return result = [o.name, ...temp];
        }
    });
    return 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.tree, 'name5'));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)

也许您可以采用递归方法解决此问题。这里的基本思想是从树中向下查找一个节点,该节点的名称与您要为其寻找父节点的节点名称相匹配(即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') )