Reputation: 524
I tried filtering a group of checkboxes with an array like so:
<ion-checkbox ng-repeat="user in users | filter: {id: group.members}" ng-model="user.checked">{{user.info.name}}</ion-checkbox>
where group.members
is an array of user.id
and it just doesn't show anything.
users Array:
[12345,123456]
group.members Array:
[12345]
I'm trying to accomplish not showing the group.members
in the list of users
, because in this case a user is trying to invite another user
to the group
and why invite someone who's already a member?
I tried creating my own filter, but its just a mess:
.filter('existingMembers', function() {
return function(users, members) {
return users.filter(function(user) {
for (var i in user.id) {
if (members.indexOf(user.id[i]) != -1) {
return;
}
}
return user;
});
};
})
Upvotes: 5
Views: 222
Reputation: 16019
After some messing around, this is the solution. See the plunkr for a working example. I think this should do the trick:
Template:
<ion-checkbox ng-repeat="user in users | filter: excludeMembers:group.members" ng-model="user.checked">{{user.info.name}}</ion-checkbox>
Angular filter:
app.filter('excludeMembers', function(){
return function(users, members){
return users.filter(function(user){
return members.indexOf(user.id) === -1;
});
}
})
Long explanation
The filter takes the array you are filtering against as a first parameter as a default, then with the colon notation (:) you can supply optional arguments, in your case: the group. The filter should return a function, which will be run. The return value should be a filtered array. We also use a native javascript filter function (confusing, whoa) to check against the group array.
Upvotes: 2
Reputation: 26161
By utilizing a look up table (LUT) object you may do some filtering like this with pure JS.
var gmems = [12345, 567890],
users = [12345,123456,432567,1234987,567890],
lut = gmems.reduce((p,c) => {p[c]=true; return p},{}),
res = users.filter(e => !lut[e]);
document.write('<pre>' + JSON.stringify(res, 0, 2) + '</pre>');
Upvotes: 0