Reputation: 5
I have 4 boolean values.
next_is_left
next_is_right
next_is_above
next_is_below
First I want to check if they are all true
. Then I want to check if one of them is false
. Then if two of them are false
, then three or if all are false
.
I wonder how I can fit this problem in one simple if condition / function. Thanks.
Upvotes: 0
Views: 306
Reputation: 994
Use arrays to do the work.
var booleans = [
next_is_left
next_is_right
next_is_above
next_is_below
];
var holdsTrue = function(arg) { return arg; };
var holdsFalse = function(arg) { return !arg; };
var theyAreAllTrue = booleans.filter(holdsTrue).length === booleans.length;
var oneOfThemIsFalse = booleans.filter(holdsFalse).length > 0;
var twoOfThemIsFalse = booleans.filter(holdsFalse).length > 1;
var threeOfThemIsFalse = booleans.filter(holdsFalse).length > 2;
var theyAreAllFalse = booleans.filter(holdsFalse).length === booleans.length;
Also with lodash you have every, some, negate, identity and size
var theyAreAllTrue = every(booleans, identity)
var theyAreAllFalse = every(booleans, negate(identity));
var numberOfFalseOnes = size(filter(booleans, negate(identity)))
var numberOfTrueOnes = size(filter(booleans, identity))
var oneOfThemIsTrue = some(booleans, identity)
var oneOfThemIsFalse = some(booleans, negate(identity))
Upvotes: 0
Reputation: 846
you can use every
method for Array to check whether all of them are true or false, and filter to see how many
var next_is_left = true;
var next_is_right = true;
var next_is_above = true;
var next_is_below = true;
var sides = [
next_is_left,
next_is_right,
next_is_above,
next_is_below,
];
sides.every(n => n === true); // checks if all true
sides.every(n => n === false); // checks if all false
sides.filter(n => n === false).length; // returns number of false variables
Upvotes: 0
Reputation: 1405
What about counting the number of true values and using switch case to deal with the result?
let next_is_left = false;
let next_is_right = true;
let next_is_above = true;
let next_is_below = false;
switch (getNumTrue(next_is_left, next_is_right, next_is_above, next_is_below)) {
case 0:
console.log(`All false`);
break;
case 1:
console.log(`1 true, 3 false`);
break;
case 2:
console.log(`2 true, 2 false`);
break;
case 3:
console.log(`3 true, 1 false`);
break;
case 4:
console.log(`All true`);
break;
}
function getNumTrue() {
let i, numTrue;
numTrue = 0;
for (i = arguments.length - 1; i > -1; i--) {
numTrue += arguments[i] ? 1 : 0;
}
return numTrue;
}
Upvotes: 0
Reputation: 138457
switch(next_is_left + next_is_right + next_is_above + next_is_below){
case 0:
console.log("all false");
break;
case 1:
console.log("one true");
break;
case 2:
console.log("two true");
break;
case 3:
console.log("one false");
break;
case 0:
console.log("all true");
break;
}
Just add the booleans up.
Upvotes: 3