我有一个包含变量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个真值组合)。
答案 0 :(得分: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 :(得分:1)
如果您有3个变量,您可以将其视为3位的排列:
000, 001, 010, 011, 100, 101, 110, 111
我们从0到2^n
,其中n
是variables.length
将数字转换为二进制,如果长度小于n
,则前置0,然后我们映射每个字符到变量,使用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++) {
var binary = i.toString(2)
binary = "0".repeat(n - binary.length) + binary
output.push(variables.reduce(function(obj, variable, index) {
obj[variable] = !!+binary.charAt(index)
return obj
}, {}))
}
console.log(output)