【问题标题】:JavaScript: Find all parents for element in tree recursiveJavaScript:在树递归中查找元素的所有父项
【发布时间】:2018-11-13 08:59:18
【问题描述】:

我有一棵这样的树

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);

【问题讨论】:

    标签: javascript recursion tree


    【解决方案1】:

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

    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; }

    【讨论】:

    • 这可行,但这不会返回相同的对象引用。我的意思是在我的情况下,我已经应用了这种方法并将值推送到节点的直接父节点中,但这并没有反映在实际的树中??
    • 这个(With parent elements)看起来一样,请问你做了什么改变:)?
    • 也许我不明白你的目标,请添加一个想要的结果的例子。
    • 实际上我想从树中删除一个节点,所以我找到了直接的父节点并使用此代码块过滤其子节点的数据,它可以很好地定位所有父节点.但是它返回的引用与树节点不同,所以即使我过滤了直接父节点的子记录,它也不会反映在树节点中!!
    • 你想改变数据吗?还是一棵新树到想要的节点?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-20
      • 2015-12-18
      • 2018-02-23
      • 2014-06-01
      • 2022-06-28
      • 1970-01-01
      • 2010-10-02
      相关资源
      最近更新 更多