2016-09-10 28 views
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個變量(即variables中的3個元素,我將得到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其中nvariables.length轉換的數字爲二進制和前面加0的若長度小於n,那麼我們將每個字符映射到變量,將字符串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)