2016-12-30 136 views
2

我想通過javascript上的嵌套數組/對象的特定鍵搜索並需要返回所有層次結構,包括它的父級,直到根父級,也是它的孩子。 下面是示例JSON:通過嵌套對象/數組的特定鍵搜索javascript

 let array = [ 
     { 
      "no": "1", 
      "name": "abc", 
      "child" : [ 
       { 
        "no": "1.1", 
        "name": "def", 
        "child" : [ 
         { 
          "no": "1.1.1", 
          "name": "Foo" 
         }, 
         { 
          "no": "1.1.2", 
          "name": "jkl" 
         } 
         ] 
       }, 
       { 
        "no": "1.2", 
        "name": "Foo", 
        "child" : [ 
         { 
          "no": "1.2.1", 
          "name": "Foo" 
         }, 
         { 
          "no": "1.2.2", 
          "name": "aaaaaaa" 
         } 
         ] 
       } 
      ] 
      }, 
     { 
      "no": "2", 
      "name": "abc2", 
      "child" : [ 
       { 
        "no": "2.1", 
        "name": "Foo", 
        "child" : [ 
         { 
          "no": "1.1.1", 
          "name": "ghi" 
         }, 
         { 
          "no": "1.1.2", 
          "name": "jkl" 
         } 
         ] 
       }, 
       { 
        "no": "2.2", 
        "name": "ghssssi", 
        "child" : [ 
         { 
          "no": "2.2.1", 
          "name": "ghssssi" 
         },  
         { 
          "no": "2.2.2", 
          "name": "asass" 
         } 
         ] 
       } 
      ] 
     } 
    ]; 

而當我們想通過鍵=「富」進行搜索,結果會是這樣的:

 array_result = [ 
     { 
      "no": "1", 
      "name": "abc", 
      "child" : [ 
       { 
        "no": "1.1", 
        "name": "def", 
        "child" : [ 
         { 
          "no": "1.1.1", 
          "name": "Foo" 
         } 
         ] 
       }, 
       { 
        "no": "1.2", 
        "name": "Foo", 
        "child" : [ 
         { 
          "no": "1.2.1", 
          "name": "Foo" 
         } 
         ] 
       } 
      ] 
     }, 
     { 
      "no": "2", 
      "name": "abc2", 
      "child" : [ 
       { 
        "no": "2.1", 
        "name": "Foo", 
        "child" : [ 
         { 
          "no": "1.1.1", 
          "name": "ghi" 
         }, 
         { 
          "no": "1.1.2", 
          "name": "jkl" 
         } 
         ] 
       } 
      ] 
     } 
    ]; 

我敢肯定,這將需要遞歸功能。任何人有想法? 謝謝!

+1

你嘗試過自己這麼遠嗎?向我們展示您的代碼,以便有人指出問題。這不是獲得完整代碼答案的地方。 – MeanGreen

+0

您希望在不改變原始數據的情況下獲得原始數據的副本嗎? –

回答

0

您可以從原始數組中獲取一份副本,並過濾該數組,如果該數組具有所需值或孩子具有該值。

var array = [{ no: "1", name: "abc", children: [{ no: "1.1", name: "def", children: [{ no: "1.1.1", name: "Foo" }, { no: "1.1.2", name: "jkl" }] }, { no: "1.2", name: "Foo", children: [{ no: "1.2.1", name: "Foo" }, { no: "1.2.2", name: "aaaaaaa" }] }] }, { no: "2", name: "abc2", children: [{ no: "2.1", name: "Foo", children: [{ no: "1.1.1", name: "ghi" }, { no: "1.1.2", name: "jkl" }] }, { no: "2.2", name: "ghssssi", children: [{ no: "2.2.1", name: "ghssssi" }, { no: "2.2.2", name: "asass" }] }] }], 
 
    find = 'Foo', 
 
    result = JSON.parse(JSON.stringify(array)).filter(function search(a) { 
 
     var children; 
 
     if (a.name === find) { 
 
      return true; 
 
     } 
 
     if (!Array.isArray(a.children)) { 
 
      return false; 
 
     } 
 
     children = a.children.filter(search); 
 
     if (children.length) { 
 
      a.children = children; 
 
      return true; 
 
     } 
 
    }); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

謝謝@nina,它幫了我很多。我根據需要修改了代碼。 – ipeh