2016-09-10 12 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からnがあれば、バイナリと先頭に追加0に番号を変換するvariables.lengthある2^nに行きます長さがn以下であれば、すべての文字を変数にマップして、で文字列binary.charAt(index)!!を使用してIntに変換します。

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)

関連する問題