如何过滤从阵列过滤成员?

时间:2017-01-19 13:49:53

标签: angularjs

我有下一个数组:

var companies = [
        {
            id:1,
            members : ['alex', 'john','nick']
        },
        {
            id:2,
            members : ['alex', 'john','nick']
        },
        {
            id:3,
            members : ['alex']
        },
        {
            id:3,
            members : ['nick']
        }
    ]

我在

中听过公司
<div ng-repeat=comp in companies |filter: someFilter>{{comp.id}}</div>

我想要的: 我想列出例如只有成员'昵称'的地方?我应该写什么过滤器?

我想列出'nick'和'john'在数组中的位置。在过滤器中写什么? 试图设置过滤器参数

{members: ["cuan", "john"]}

但它不起作用 比你提前。

1 个答案:

答案 0 :(得分:0)

您需要查看值中的列表(即members属性),看看您是否能找到至少一个与您的过滤器参数匹配的项目:

angular.module('app', [])
.filter('myfilter', function() {
  return function(value, expected) {
    return value && value.members && (value.members || []).indexOf(expected) >= 0; // this checks if at least one value from members matches the given filter param
  };
})

然后使用它:

<div ng-repeat=comp in companies | myfilter:'nick'>{{comp.id}}</div>

<div ng-repeat=comp in companies | myfilter:'nick' | myfilter:'john'>{{comp.id}}</div>

注意:管道它们会有效地产生“AND”效果。现在这不是最高效的结果,但对于小型列表,这不是问题

或者你可以允许传递一个数组作为参数并在过滤函数中进行“AND”检查 - 这会更高效:

angular.module('app', [])
.filter('myfilter', function() {
  return function(value, expected) {
    return value && value.members && 
       (expected || []).every(function(exp) { return value.members.indexOf(exp) >= 0; }) 
  };
})

然后用作:

<div ng-repeat=comp in companies | myfilter:['nick','john']>{{comp.id}}</div>

不:e使用every进行AND,可以轻松更改为some以获得OR效果。您甚至可以参数化操作类型,如下所示:

.filter('myfilter', function() {
  return function(value, type, expected) {
    return value && value.members && 
       (expected || [])[type](function(exp) { return value.members.indexOf(exp) >= 0; }) 
  };
})

然后你也可以将它用于OR效果:

<div ng-repeat=comp in companies | myfilter:'every':['nick','john']>{{comp.id}}</div>

<div ng-repeat=comp in companies | myfilter:'some':['nick','john']>{{comp.id}}</div>