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



我有一个包含变量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,其中nvariables.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)

相关内容

  • 没有找到相关文章

最新更新