如何按属性过滤为空数组?

时间:2015-04-13 01:55:27

标签: angularjs angularjs-ng-repeat

我在ng-repeat上有这个

<tr ng-repeat="website in websites">
    <td>{{website.url}}</td>
</tr>

来自website数组的每个websites对象如下所示:

{
  url: "example.com",
  groups: []
}

问题:如何将过滤器应用于上面的循环,以便它只显示groups属性为空数组的元素?

我尝试的事情:

data-ng-repeat="website in websites | filter: {groups: []}"
data-ng-repeat="website in websites | filter: !groups.length"
data-ng-repeat="website in websites | filter: groups.length === 0"

(在控制台中没有错误但过滤掉所有内容)

data-ng-repeat="website in websites | filter: {groups: ''}"

(与我想要的相反,只显示groups不是空数组的项目)

data-ng-repeat="website in websites | filter: {groups: null}"

(如果不使用[]我使用null来表示没有值,这可行,但它看起来很麻烦......因为我需要经常注意{{ 1}}属性变为空,并手动将其设置为空)

2 个答案:

答案 0 :(得分:4)

我在控制器中添加了一个过滤功能:

JS:

angular.module('myApp', [])
  .controller('myController', ['$scope',
    function($scope) {
      $scope.friends = [{
        name: 'John', phone: '555-1276', a: [1, 2, 3]
      }, { name: 'Mary',  phone: '800-BIG-MARY',  a: [1, 2, 3]
      }, { name: 'Mike', phone: '555-4321',  a: null
      }, { name: 'Adam', phone: '555-5678', a: []
      }, { name: 'Julie', phone: '555-8765', a: []
      }, { name: 'Juliette', phone: '555-5678', a: []
      }];

      $scope.filterFn = function(item) {
        // must have array, and array must be empty
        return item.a && item.a.length === 0;
      };

    }
  ]);

在你的模板中:

<table>
  <tr><th>Name</th><th>Phone</th><th>array len</th></tr>
  <tr ng-repeat="friend in friends | filter: filterFn">
    <td>{{friend.name}}</td>
    <td>{{friend.phone}}</td>
    <td>{{friend.a.length}}</td>
  </tr>
</table>

Modified Angular Filter doc plnkr

答案 1 :(得分:3)

你可以像这样使用比较器参数。

<tr ng-repeat="website in websites | filter:{groups: []}:true">
    <td>{{website.url}}</td>
</tr>

Angularjs official document描述true的含义。

  

true:函数的简写(实际,预期){return angular.equals(actual,expected)}。这基本上是对预期和实际的严格比较。

jsfiddle is here.