Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Filtering an array with an array in AngularJS

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;

        });
    };
})
like image 980
rcpilotp51 Avatar asked Oct 31 '22 05:10

rcpilotp51


1 Answers

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.

like image 186
Justus Romijn Avatar answered Nov 13 '22 19:11

Justus Romijn