2016-04-25 13 views
5

Próbowałem filtrowanie grupę wyboru z tablicą tak:Filtrowanie tablicy z tablicy w angularjs

<ion-checkbox ng-repeat="user in users | filter: {id: group.members}" ng-model="user.checked">{{user.info.name}}</ion-checkbox>

gdzie group.members jest tablicą user.id i to po prostu nie pokazuje nic.

użytkowników Array:

[12345,123456]

group.members Array:

[12345]

Próbuję wykonać nie pokazującgroup.members w liście users, ponieważ w w tym przypadku użytkownik próbuje zaprosić kolejną user do group i dlaczego w vite ktoś, kto jest już członkiem?

Próbowałem tworzyć własne filtry, ale jej po prostu bałagan:

.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; 

     }); 
    }; 
}) 
+0

@NikhileshKV wszystko wskazuje poprawnie. – rcpilotp51

Odpowiedz

2

Po pewnym bawić, jest to rozwiązanie. See the plunkr dla przykładu roboczego. myślę, że to powinno wystarczyć:

Szablon:

<ion-checkbox ng-repeat="user in users | filter: excludeMembers:group.members" ng-model="user.checked">{{user.info.name}}</ion-checkbox> 

filtr kątowy:

app.filter('excludeMembers', function(){ 
    return function(users, members){ 
    return users.filter(function(user){ 
     return members.indexOf(user.id) === -1; 
    }); 
    } 
}) 

Długie wyjaśnienie

Filtr bierze tablicę jesteś filtrowanie przed jak pierwszy parametr jako domyślny, a następnie zapis dwukropka (:) możesz podać opcjonalne argume w twoim przypadku: grupa. Filtr powinien zwrócić funkcję, która zostanie uruchomiona. Wartość zwracana powinna być tablicą filtrowaną. Używamy również funkcji natywnego filtra javascript (mylące, whoa) do sprawdzenia względem tablicy grupy.

+0

to nie działa. – rcpilotp51

+1

@ rcpilotp51 Zaktualizowany. –

+0

@ rcpilot51 Zaktualizowano (bis) – malix

0

Korzystając z obiektu tabeli wyszukiwania (LUT) można wykonać filtrowanie w ten sposób przy użyciu czystego 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>');

+0

dzięki, ale chciałbym użyć filtra. jakieś inne sugestie? dziękuję – rcpilotp51

+0

Masz na myśli funkcję filtrowania? Następnie możesz wykorzystać powyższy kod jako 'function userFilter (u, g) {var lut = g.reduce ((p, c) => {p [c] = true, return p}, {}); return u.filter (e =>! lut [e])}; ' – Redu

Powiązane problemy