2017-08-07 116 views
0

我正在用搜索選項在樹結構中構建動態菜單。以樹結構搜索JSON數據

JSON數據看起來象下面這樣:

directories = [ 
      { 
       name: 'parent1', 
       child: [{ 
        name: 'child1', 
        child: [{ 
         name: 'child2', 
         child: [] 
        }] 
       }, 
       { 
        name: 'child2', 
        child: [] 
       }] 
      }, 
      { 
       name: 'parent2', 
       child: [{ 
        name: 'child1', 
        child: [] 
       }] 
      }, 
      { 
       name: 'parent2', 
       child: [{ 
        name: 'child1', 
        child: [] 
       }, 
       { 
        name: 'child2', 
        child: [] 
       }] 
      } 
     ]; 
    } 

下面的代碼來搜索父節點級別的項目:

searchFilter(search: string) { 
     console.log(search); 
     this.filteredArray = this.directories.filter(item => { 
      if (item.name.toString().toLowerCase().startsWith(search.toLowerCase())) { 
       return true; 
      } 
      return false; 
     } 
     ); 
     console.log(this.filteredArray); 
    } 

我打電話上方keyup事件代碼,並將其返回的搜索結果父節點級別。

現在我想搜索直到第n個孩子。任何幫助?

+0

你需要一個遞歸實現,此外,您應該重命名'child'屬性'children'因爲這樣一來,你即刻知道它是一個'數組'。 – Supamiu

+0

你可以用遞歸透視的代碼來解釋嗎 –

+0

我在上面的回答中提供了一個例子,但基本上不用進入數組使用一個級別(這就是過濾器所做的),而是更深入地返回第一個匹配元素。 – Supamiu

回答

1

你需要一個遞歸實現你的過濾器,是這樣的:

function searchFilter(search: string, directories: any[]) { 
    for(let directory of directories){ 
     if(directory.name.toLowerCase().startsWith(search)){ 
      return directory; 
     } 
     if (directory.child !== undefined && directory.child.length > 0) { 
      let childsearch = searchFilter(search, directory.child) 
      if (childsearch !== undefined) { 
       return childsearch 
      } 
     } 
    } 
    return undefined; 
} 

see on typescript playground

另一種方法是可以將所有匹配的項目你的陣列(行爲像一個第n個深度過濾器)在返回:

function searchFilter(search: string, directories: any[], results = []) { 
    for(let directory of directories){ 
     if(directory.name.toLowerCase().startsWith(search)){ 
      results.push(directory); 
     } 
     if (directory.child !== undefined && directory.child.length > 0) { 
      let childsearch = searchFilter(search, directory.child) 
      if (childsearch !== undefined) { 
       results = results.concat(childsearch); 
      } 
     } 
    } 
    return results; 
} 

see on typescript playground

+0

這隻適用於數組 –

+0

的第一項@VigneshwaranMarkandan我編輯了示例以修復遞歸行爲,現在它正常工作。 – Supamiu

+0

謝謝,會試試這個 –

1

這會顯得整個樹內,並提供一個數組的所有相應的結果

searchFilter2(search: string, directories: any[]) { 
    let results = []; 
    for (let directory of directories) { 
     if (directory.name.toLowerCase().startsWith(search)) { 
     results.push(directory); 
     } 
     if (directory.child && directory.child.length > 0) { 
     results = [...results, ...this.searchFilter2(search, directory.child)]; 
     } 
    } 
    return results; 
} 
+0

謝謝,會試試這個 –