Сгенерировать возможные значения истинности переменных в массиве

У меня есть массив с переменными 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 переменные (т.е. 3 элемента в variables, я получу 2 ^ 3 = 8 комбинаций значений истинности).


person Jamgreen    schedule 10.09.2016    source источник


Ответы (2)


    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  } ]

запустив код. Я использую простые битовые манипуляции.

person Zanko    schedule 10.09.2016

если у вас есть 3 переменные, вы можете думать об этом как о перестановке 3 битов:

000, 001, 010, 011, 100, 101, 110, 111

we go from 0 to 2^n where n is variables.length converting the numbers to binary and prepending 0's if the length is less then n, then we map every char to a variable, converting the String binary.charAt(index) to Int with + then to Bool using !!.

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)

person TedMeftah    schedule 10.09.2016