以这种特定方式比较真实性的最简单方法是什么?



根据以下说明,我创建了一个满足要求的函数。我觉得我的函数有点太复杂了,尽管它做了它应该做的事情。对我自己来说,困难的部分是避免平等运算符。我能想到解决这个问题的唯一方法是使用一些数学和比较运算符。如何简化此功能并节省一些编辑时间? 提前谢谢。

编写一个接受任何类型的三个参数的函数onlyOne

onlyOne仅当三个参数中只有一个是 实话实说。否则,它应该返回 false。

不要在解决方案中使用相等运算符(=====)。

我的职能:

function onlyOne(input1, input2, input3) {
output = false;
let truthy = 0;
let falsey = 0;
if (!!input1) {
truthy++;
} else {
falsey++;
}
if (!!input2) {
truthy++;
} else {
falsey++;
}
if (!!input3) {
truthy++;
} else {
falsey++;
}
if (falsey > truthy) {
output = true;
}
if (falsey > 2) {
output = false;
}
return output;
}

我会在每个参数上调用Booleanreduce成一个数字,然后检查该数字的真实性减去一:

const onlyOne = (...args) => {
const numTruthy = args.reduce((a, arg) => a + Boolean(arg), 0);
return !Boolean(numTruthy - 1);
};
console.log(onlyOne(0, 0, 0));
console.log(onlyOne(0, 0, 1));
console.log(onlyOne(0, 1, 1));
console.log(onlyOne(1, 1, 1));

或者,对于更简洁但更难理解的版本,您可以将1集成到提供给reduce的初始值中:

const onlyOne = (...args) => !args.reduce((a, arg) => a + Boolean(arg), -1);
console.log(onlyOne(0, 0, 0));
console.log(onlyOne(0, 0, 1));
console.log(onlyOne(0, 1, 1));
console.log(onlyOne(1, 1, 1));

您可以使用filtercount,如下所示。

filterCount函数中,第一个参数将决定您是要truthy计数还是falsy计数。

const filterCount = (bool, ...args) => args.filter(i => i == bool).length;
console.log("truthy = " + filterCount(true, 1, 0, 0));
console.log("falsy = " + filterCount(false, 1, 0, 0));
console.log("truthy = " + filterCount(true, 1, 0, 1));
console.log("falsy = " + filterCount(false, 1, 0, 1));

一行:

let onlyOne = (a, b, c) => !(!!a + !!b + !!c - 1);

!!将值强制转换为布尔值。+将布尔值强制转换为数字,其中true变得1false变得0。我们汇总数字,现在我们可以得到这些潜在总数中的任何一个:0、1、2 或 3。 我们只关心总共 1,我们可以从中减去 1 得到 0,然后取反它(这会迫使它回到布尔值),这使它true

最新更新