1

Ich habe ein Array mit Variablen var variables = ['a', 'b', 'c'].Erzeuge mögliche Wahrheitswerte von Variablen im Array

Ich möchte die Ausgabe ändern

[ 
    { 
    'a': true, 
    'b': true, 
    'c': true 
    }, 
    ... 
] 

Was ich will, ist ein Array von Objekten mit allen möglichen Wahrheitswerte auf diese Variablen zu erhalten, die so etwas wie http://jamie-wong.com/experiments/truthtabler/SLR1/ oder https://stackoverflow.com/a/26610870/1715426 ist.

Also zum Beispiel, wenn ich 3 Variablen habe (d. H. 3 Elemente in variables, bekomme ich 2^3 = 8 Kombinationen von Wahrheitswerten).

Antwort

1

var variables = ['a', 'b', 'c']; 
 
    var numberOfSets = 1 << variables.length; 
 
    var results = []; 
 
    for (var i = 0; i < numberOfSets; i++) { 
 
     results.push({}); 
 
     for (var j = 0; j < variables.length; j++) { 
 
     if (((1 << j) & i) > 0) { 
 
      results[i][variables[j]] = true; 
 
     } else { 
 
      results[i][variables[j]] = false; 
 
     } 
 
     } 
 
    } 
 
    console.log(results);

Ist das, was Sie meinen? Ich habe

[ { a: false, b: false, c: false }, 
    { a: true, b: false, c: false }, 
    { a: false, b: true, c: false }, 
    { a: true, b: true, c: false }, 
    { a: false, b: false, c: true }, 
    { a: true, b: false, c: true }, 
    { a: false, b: true, c: true }, 
    { a: true, b: true, c: true } ] 

durch Ausführen des Codes. Ich benutze einfache Bitmanipulationen.

1

wenn Sie 3 Variablen haben, können Sie daran denken, wie die Permutation von 3 Bits:

000, 001, 010, 011, 100, 101, 110, 111

wir gehen 0-2^n wo n ist variables.length die Zahlen in binäre Umwandlung und das Voranstellen von 0en, wenn die Länge ist kleiner als n, dann ordnen wir jedes Zeichen einer Variablen zu, konvertieren die Zeichenfolge binary.charAt(index) zu Int mit + und dann zu Bool mit !!.

var variables = ['a', 'b', 'c'] 
 
var output = [] 
 

 
var n = variables.length 
 

 
for (var i = 0; i < Math.pow(2, n); i++) { 
 
\t var binary = i.toString(2) 
 
\t binary = "0".repeat(n - binary.length) + binary 
 
\t output.push(variables.reduce(function(obj, variable, index) { 
 
\t \t obj[variable] = !!+binary.charAt(index) 
 
\t \t return obj 
 
\t }, {})) 
 
} 
 

 
console.log(output)

Verwandte Themen