我有下一个数组:
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"]}
但它不起作用 比你提前。
答案 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>