rcpilotp51
rcpilotp51

Reputation: 524

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;

        });
    };
})

Upvotes: 5

Views: 222

Answers (2)

Justus Romijn
Justus Romijn

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

Redu
Redu

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

Related Questions