1

У меня есть массив с переменными var variables = ['a', 'b', 'c'].Генерировать возможные значения истинности переменных в массиве

Я хочу, чтобы изменить вывод

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

То, что я хочу, чтобы получить массив объектов со всеми возможными значениями истинности для этих переменных, что является чем-то вроде http://jamie-wong.com/experiments/truthtabler/SLR1/ или https://stackoverflow.com/a/26610870/1715426.

Так, например, когда у меня есть 3 переменные (т. Е. 3 элемента в variables, я получу 2^3 = 8 комбинаций значений истинности).

ответ

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);

Это то, что вы имеете в виду? Я получил

[ { 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 } ] 

, запустив код. Я использую простые манипуляции с битами.

1

, если у вас есть 3 переменные, вы можете думать о нем, как перестановкой 3 бита:

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

мы переходим от 0 до 2^n где n является variables.length преобразования числа в двоичную и Предварение 0, если длина меньше n, тогда мы сопоставляем каждый символ переменной, преобразовывая String binary.charAt(index) в Int с +, затем в Bool, используя !!.

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)