web-dev-qa-db-ja.com

Angularjsフィルターのネストされたオブジェクト

私はangularこのようなネストされたオブジェクトを持っています。ネストされたプロパティのためにそれをフィルタリングする方法はありますか?

<li ng-repeat="shop in shops | filter:search">
search.locations.city_id = 22

親要素のみを表示していますが、次のように両方でフィルタリングしたいと思います。

search = 
  category_id: 2
  locations:
    city_id: 368

[
 name: "xxx"
 category_id: 1
 locations: [
   city_id: 368
   region_id: 4
  ,
   city_id: 368
   region_id: 4
  ,
   city_id: 368
   region_id: 4
  ]
,
 name: "xxx"
 category_id: 2
 locations: [
   city_id: 30
   region_id: 4
  ,
   city_id: 22
   region_id: 2
  ]
]
7
zajca

はい、できます。あなたの例を正しく理解していれば可能です。

コレクションのサイズによっては、ng-repeatで反復するコレクションを計算して、モデルの変更時にフィルターが常にそれを実行しないようにする方がよい場合があります。

http://jsfiddle.net/suCWn/

私があなたを正しく理解していれば、基本的にあなたはこのようなことをします:

$scope.search = function (shop) {

    if ($scope.selectedCityId === undefined || $scope.selectedCityId.length === 0) {
        return true;
    }

    var found = false;
    angular.forEach(shop.locations, function (location) {          
        if (location.city_id === parseInt($scope.selectedCityId)) {
            found = true;
        }
    });

    return found;
};
9

このようにフィルタリングすることもできます(バージョン1.2.13以降)

<li ng-repeat="shop in shops | filter: { locations: [{ city_id: search.locations.city_id }] }">
23
martinoss

「WordsLikeJared」の回答を更新して、正規表現を使用して検索語が含まれているかどうかを確認するようにしました。この方法では、1つの数字を入力するとフィルタリングが開始されるため、Word全体を照合する必要はありません。

JSfiddle

    angular.forEach(shop.locations, function (location) {          
        if (checknum(location.city_id)) {
            found = true;
        }
    });

    function checknum(num){
        var regx = new RegExp($scope.selectedCityId);
        return regx.test(num);
    };
0
Damain Joseph