在数组中生成变量的可能真值

时间:2016-09-10 20:46:38

标签: javascript arrays multidimensional-array logic truthtable

我有一个包含变量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个真值组合)。

2 个答案:

答案 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,其中nvariables.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)