如果对象不为空,则Angularjs过滤对象属性

时间:2017-10-25 21:14:30

标签: javascript angularjs

我正在尝试执行以下操作:

<div class="row" ng-repeat="user in ctr.users | filter:{entity.name:filterEntityName}" >

...但是,有些用户拥有空实体。如何仅在实体存在时过滤实体名称?

2 个答案:

答案 0 :(得分:2)

这是具有任意长度属性链(entity.name.data)的自定义过滤器。如果某个属性值为falsy(!val),则item将转到输出,否则仅当目标值包含搜索目标(val.indexOf(value) != -1)时才会发生:

angular.module('app', []).controller('ctrl', function($scope){
    this.users = [
      {entity:{name:{data:'Max'}}, name: 'Max'},      
      {entity:{name:{data:'Sam'}}, name: 'Sam'},
      {name: 'Henry'},
      {entity: null, name: 'John'},                  
      {entity: {name:null}, name: 'Kate'},                  
      {entity: {name:{data:null}}, name: 'Tom'},             
    ]
}).filter('myfilter', function(){
  return function(array, search){
    var property = Object.keys(search)[0];
    var value = search[property];
    if(value){      
      var props = property.split('.');
      return array.filter(x => {        
        for(var prop of props){
          var index = props.indexOf(prop);
          var last = props.length - 1;
          
          val = index == 0 ? x[prop] : val[prop];                    
          if(!val)
            return true;
          if(val && index == last)
            return val.indexOf(value) != -1;                    
        }        
      });
    }
    return array;
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app='app' ng-controller='ctrl as ctr'>
  <input type='text' ng-model='filterEntityName'/>
  <div class="row" ng-repeat="user in ctr.users | myfilter:{entity.name.data:filterEntityName}">
    {{user | json}}
  </div>
</div>

答案 1 :(得分:0)

你可以使用&#39; !!&#39;在过滤器中,如果属性未定义或为null,则跳过。

 <div class="row" ng-repeat="user in ctr.users | filter:{entity.name: '!!'}" >