簡體   English   中英

JavaScript:在樹遞歸中查找元素的所有父項

[英]JavaScript: Find all parents for element in tree recursive

我有一棵像這樣的樹

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,而不僅僅是父元素的 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);

您可以使用遞歸方法通過檢查名稱並將僅包含節點的新數據結構返回到所需對象。

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

也許您可以對這個問題采用遞歸方法。 這里的基本思想是在樹中向下查找一個節點,該節點的名稱與您要為其查找父節點的節點名稱相匹配(即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') )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM