2012-08-01 4 views
7

ho un allineamento con le autorizzazioni da Facebook e una serie di autorizzazioni che l'utente shouldve dato:confrontare due array se le chiavi coincidono con underscore.js

window.FB.api('/me/permissions', function(perm){      
    if(perm){ 
     var given_permissions = _.keys(perm['data'][0]; 
     var needed_permissions = ["publish_stream", "email"]; 
     //now check if given permissions contains needed permissions 
    } 
} 

Ora voglio confrontare se tutto il needed_permissions sono in given_permissions, in un modo esperto di sottolineatura (senza eseguire il loop di due array e confrontare i valori). Ho visto un metodo _.include, ma questo confronta un array con un valore. Voglio restituire true se tutte le autorizzazioni sono disponibili e altre false. Stavo cercando una bella chiamata su linea singola, se possibile.

La ragione di ciò è che FB.login restituisce true anche se l'utente sceglie di annullare le autorizzazioni estese. Quindi ho bisogno di ricontrollare questo.

risposta

4

Che ne dici di questo?

_.all(needed_permissions, function(v){ 
    return _.include(given_permissions, v); 
}); 
18

Si potrebbe utilizzare _.difference per vedere se la rimozione delle autorizzazioni dato dai autorizzazioni necessarie lascia nulla dietro:

var diff = _(needed_permissions).difference(given_permissions) 
if(diff.length > 0) 
    // Some permissions were not granted 

un piacevole effetto collaterale di questo è che si ottiene le autorizzazioni mancanti in diff nel caso in cui vuoi dire loro cosa c'è che non va.

+0

Questa è anche una bella soluzione. Dovrò contrassegnare l'altro come risposta, perché è fondamentalmente quello che ho chiesto, ma penso che userò questa soluzione in modo da poter fornire un feedback migliore. – Jareish

+0

Non sono d'accordo e penso che sarebbe molto più utile rendere questa risposta accettata. _.difference è esattamente quello che hai chiesto ("confronta due array se le chiavi corrispondono a underscore.js" - il resto era davvero speculazione credo) e in effetti la risposta che hai "accettato" perché l'hai usata! Solo un pensiero per aiutare gli altri a guardare questo. Immagino che non tutti controlleranno la risposta accettata. La risposta accettata è piuttosto scarsa come soluzione poiché non aggiunge nulla quando underscore fornisce una funzione per fare esattamente questo "out of the box". – SuperDuperApps

0

risposta tardiva, ma questo funziona per me: _.isEqual(given_permissions, needed_permissions);