si potrebbe, anche se è il male, utilizzare un eval dopo aver riunito tutti gli elementi dell'array. cioè
var arr = [true, '&&', false];
if(eval(arr.join(''))){
// your code
}
Aggiornamento:
Sono recentemente pensato a un molto più semplice (non più semplice di eval), ma risposta sicura. Se le uniche operazioni booleane utilizzate sono &&
e ||
e le parentesi sono formattate correttamente, è possibile eseguire una serie di regex sostitutive fino a quando non è rimasto un solo valore, "vero" o "falso".
I valori booleani cercare e operazioni possono essere che la seguente e semplificare al vero o falso
true && true == true true && false == false false && true == false false && false == false
lo stesso vale per operazioni OR
true || true == true true || false == true false || true == true false || false == false
Come risultato , possiamo sostituire l'espressione con i loro valori semplificati - vero o falso. Quindi, se ci sono parentesi intorno all'espressione, finirà come '(true)'
o '(false)'
e possiamo facilmente regex sostituire anche quello.
Possiamo quindi eseguire il ciclo di questa routine finché non viene lasciato un valore, 'true'
o 'false'
.
, ad es.nel codice
var boolArr = ["(", true, "&&", "(", false, "||", true, ")", ")", "||", true];
//Convert the array to a string "(true&&(false||true))||true"
var boolString = boolArr.join('');
//Loop while the boolean string isn't either "true" or "false"
while(!(boolString == "true" || boolString == "false")){
//Replace all AND operations with their simpler versions
boolString = boolString.replace(/true&&true/g,'true').replace(/true&&false/g,'false');
boolString = boolString.replace(/false&&true/g,'false').replace(/false&&false/g,'false');
//Replace all OR operations with their simpler versions
boolString = boolString.replace(/true\|\|true/g,'true').replace(/true\|\|false/g,'true');
boolString = boolString.replace(/false\|\|true/g,'true').replace(/false\|\|false/g,'false');
//Replace '(true)' and '(false)' with 'true' and 'false' respectively
boolString = boolString.replace(/\(true\)/g,'true').replace(/\(false\)/g,'false');
}
//Since the final value is a string of "true" or "false", we must convert it to a boolean
value = (boolString == "true"?true:false);
annd, se siete veramente pericoloso, è possibile concatenare tutti quei sostituisce insieme
Inoltre, si prega di notare la bella mancanza di ricorsione e l'uso di un solo ciclo
domanda importante: possiamo supporre che l'array contiene sempre JS validi, o si potrebbe avere una matrice non valida come '[ '(', ';', vero', ')'] '? –
Salve @Jordash se una qualsiasi risposta ha risolto la tua domanda per favore considera di accettarla cliccando sul segno di spunta. Ciò indica alla comunità più ampia che hai trovato una soluzione e dà una certa reputazione sia al rispondente che a te stesso. Non c'è l'obbligo di farlo. –
@procrastinator Penso che questa domanda provenga da 'Maggio 12', quest'anno non' Maggio '12 ', no? Mi sto perdendo qualcosa? – 1252748