我有一个包含变量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个真值组合)
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 } ]
通过运行代码。我正在使用简单的位操作
如果你有3个变量,你可以把它想象成3位的排列:
000, 001, 010, 011, 100, 101, 110, 111
我们从0到2^n
,其中n
是variables.length
,将数字转换为二进制,如果长度小于n
,则前置0,然后我们将每个char映射为变量,将字符串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)