2015-12-15 9 views
7

Non sono sicuro di come sia meglio formulare una parola (e, di conseguenza, non è stato possibile trovare risposte precedenti, anche se mi aspetto che abbia avuto risposta prima), ma mi interessa sapere se c'è un modo per trasformare il codice come questo:Applicare condizionalmente a! ad un metodo in JavaScript

if (this.props.mailboxFilter == 'sent') { 
    return this.currentUser.canActOnBehalfOf(m.senderID); 
} else { 
    return !this.currentUser.canActOnBehalfOf(m.senderID); 
} 

per qualcosa di simile al di sotto (non so come meglio esprimerlo):

var bangOrNot = this.props.mailboxFilter == 'sent ? '!' : ''; 
bangOrNot(this.currentUser.canActOnBehalfOf(m.senderID)); 

come in, c'è un modo per evitare il prolungato se il resto della sintassi e tutta la ripetizione/scegliendo se chiamare o meno la linea return con il botto?

+1

La soluzione potrebbe essere altrove nella tua logica. Vuoi davvero inviare l'inverso delle autorizzazioni? Sembra strano – isherwood

risposta

9

Si potrebbe semplificare in altri modi:

var response = this.currentUser.canActOnBehalfOf(m.senderID); 
return this.props.mailboxFilter == 'sent' ? response : !response; 

In generale, si vorrebbe evitare questo metodo se la funzione cambia ogni stato. Tuttavia, dal momento che in questo caso lo si sta chiamando a prescindere, non c'è nulla di male nel memorizzare prima il suo valore nella cache.

-4

Supponendo che si stia utilizzando javascript, è possibile utilizzare il metodo eval per valutare una stringa di codice javascript. È possibile applicare condizionalmente il botto alla parte anteriore della stringa e quindi restituire il risultato di eval.

+1

Non farlo ... – Lucas

+0

Perché no? Questo non è per sfidarti, sono seriamente curioso. –

+0

Eval is evil ... –

5

Se this.currentUser.canActOnBehalfOf(m.senderID) restituisce sempre un valore booleano, è possibile eseguire XOR.

return (this.props.mailboxFilter != 'sent')^this.currentUser.canActOnBehalfOf(m.senderID); 

XOR un valore booleano con true fa un NOT. E XOR con false crea un buffer che mantiene lo stesso valore.

Nota che ho modificato il == in !=.

E, assicurati di inserire commenti su questa parte del codice se hai intenzione di usarlo effettivamente. Non è così facile leggere questo codice dopo un po '.

Aggiornamento

Come Bergi suggerito, è meglio usare booleano XOR != per restituire un valore booleano.

return (this.props.mailboxFilter != 'sent') != this.currentUser.canActOnBehalfOf(m.senderID); 

E, naturalmente, se può essere utilizzato con XNOR booleano pure, basta sostituire entrambe le != s con == nel codice sopra.

+1

Questo è il modo più efficiente. – TbWill4321

+0

Mi piace questo ... ma il tuo io futuro non lo farà! – Xophmeister

+0

@Xophmeister Naturalmente :) Si può usare questo per massimizzare la sicurezza del proprio lavoro! Nessun altro può leggere questo codice! –

3

si desidera utilizzare l'operatore booleano XNOR qui - conosciuto anche come equivalenza:

return this.currentUser.canActOnBehalfOf(m.senderID) == (this.props.mailboxFilter == 'sent'); 
0

ci sono molte buone commenti perché o perché non fare una cosa simile. Suppongo che l'OP abbia buone ragioni per voler applicare il botto (!) Davanti al risultato della chiamata di funzione. La mia risposta è più di una soluzione tecnica alla domanda dell'OP.

function bang(r) { 
    return !r; 
} 
function notBang(r) { 
    return r; 
} 
function canActOnBehalf() { 
    return true; 
} 
var filter = 'notsent'; 
var f = (filter == 'sent' ? bang : notBang); 
f(canActOnBehalf('whatever')); 
Problemi correlati