2017-08-17 33 views
0

我想要搜索數組中的字符串。我的問題是,我的數組非常大,並有許多嵌套數組。如何在深嵌套數組中搜索

它看起來像這樣:

[ 
    { 
     "Id":null, 
     "Text":"Marketing", 
     "Gruppen":[ 
     { 
      "Id":null, 
      "Text":"Werbeartikel", 
      "Gruppen":[ 
       { 
        "Id":null, 
        "Text":"Werbegeschenk Hobby, Freizeit", 
        "Gruppen":[ 
        { 
         "Id":"51004839", 
         "Text":"Taschenmesser (Werbeartikel)", 
         "Gruppen":null 
        }, 
        { 
         "Id":"51004843", 
         "Text":"Schirm (Werbeartikel)", 
         "Gruppen":null 
        }, 
        { 
         "Id":"51004845", 
         "Text":"Sportartikel (Werbeartikel)", 
         "Gruppen":null 
        } 
        ] 
       } 
      ] 
     } 
     ] 
    } 
] 

現在我想搜索(Taschenmesser)。我只需要查看所有「文本」字段。

我不知道如何做到這一點。 我想要得到的結果爲:,

{ 
"Id":"51004839", 
"Text":"Taschenmesser (Werbeartikel)", 
"Gruppen":null 
} 

這裏是我與搜索方法。但它不搜索嵌套嵌套嵌套數組:

$scope.SearchForGroup = function (pSearchText) { 
     var lGruppe = $filter('filter')($scope.WarenGruppenResponse.WarenGruppe, "Schirm") 

    }; 

這裏plunker展示問題http://plnkr.co/edit/l0cnZQPAh2HXLX1yTnLl?p=info

+2

它*會*搜索樹中的嵌套節點。在文本框中輸入「Schirm」,你會看到ng-repeat仍然在你的數組中顯示唯一的元素。輸入「Foo」,你會看到它不再。你真的想實現什麼?如果要顯示包含輸入文本的樹的所有節點,爲什麼不將樹轉換爲平面的節點數組,然後過濾該平面數組? –

+0

我想當我在「Schirm」出現的文本框中輸入「Schirm」而不是包含嵌套數組的「父母」數組「Schirm」 – Ertan

+0

所以,只要按照我的建議進行操作即可。將您的樹變換爲平面的節點陣列,並通過其Text屬性過濾這些節點。這是10行代碼。 http://plnkr.co/edit/MUxMg4Pua9r1he1K6NJm?p=preview –

回答

0

既然你已經嵌套列表,你可以寫搜索算法張貼在這裏:LINK

我會使用輸入觀察者和產生新的數組:

$scope.search = ''; 

    $scope.foundItems = []; 

    function searchTree(element, matchingTitle){ 
    if(element.Text.indexOf(matchingTitle) > -1){ 
      return element; 
    }else if (element.Gruppen != null){ 
      var i; 
      var result = null; 
      for(i=0; result == null && i < element.Gruppen.length; i++){ 
       result = searchTree(element.Gruppen[i], matchingTitle); 
      } 
      return result; 
    } 
    return null; 
} 

    $scope.$watch(function() { 
     return $scope.search; 
    }, 
      function (newVal, oldVal) { 

       $scope.foundItems = []; 

       if (newVal !== undefined && newVal !== oldVal && newVal !== '') { 


        var result = searchTree($scope.data[0], newVal); 

        console.log(result); 

        $scope.foundItems.push(result); 

       } 
    }); 

DEMO