2016-04-25 31 views
5

Ho provato filtrare un gruppo di caselle di controllo con una matrice in questo modo:filtraggio di un array con una matrice in AngularJS

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

dove group.members è un array di user.id e semplicemente non mostra nulla.

utenti Array:

[12345,123456]

group.members Array:

[12345]

sto cercando di realizzare non mostrando il group.members nella lista dei users, perché in In questo caso, un utente sta tentando di invitare un altro user allo group e perché in vite qualcuno che è già un membro?

Ho cercato di creare il mio proprio filtro, ma il suo solo un pasticcio:

.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 tutto mostra correttamente. – rcpilotp51

risposta

2

Dopo un po 'nei guai, questa è la soluzione. See the plunkr per un esempio funzionante. Penso che questo dovrebbe fare il trucco:

Template:

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

filtro angolare:

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

spiegazione lungo

Il filtro prende la matrice che si sta filtrando contro l'AS un primo parametro come predefinito, quindi con la notazione dei due punti (:) è possibile fornire argume opzionale nts, ​​nel tuo caso: il gruppo. Il filtro dovrebbe restituire una funzione, che verrà eseguita. Il valore di ritorno dovrebbe essere un array filtrato. Usiamo anche una funzione di filtro javascript nativo (confuso, whoa) per verificare contro l'array del gruppo.

+0

questo non funziona. – rcpilotp51

+1

@ rcpilotp51 Aggiornato. –

+0

@ rcpilot51 Aggiornato (bis) – malix

0

Utilizzando un oggetto Look Up Table (LUT) è possibile eseguire alcuni filtri come questo con JS puro.

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

grazie ma vorrei usare un filtro. qualche altro suggerimento? grazie – rcpilotp51

+0

Intendi una funzione di filtro? Quindi puoi utilizzare il codice sopra come 'function userFilter (u, g) {var lut = g.reduce ((p, c) => {p [c] = true; return p}, {}); return u.filter (e =>! lut [e])}; ' – Redu