根据以下说明,我创建了一个满足要求的函数。我觉得我的函数有点太复杂了,尽管它做了它应该做的事情。对我自己来说,困难的部分是避免平等运算符。我能想到解决这个问题的唯一方法是使用一些数学和比较运算符。如何简化此功能并节省一些编辑时间? 提前谢谢。
编写一个接受任何类型的三个参数的函数
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;
}
我会在每个参数上调用Boolean
并reduce
成一个数字,然后检查该数字的真实性减去一:
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));
您可以使用filter
和count
,如下所示。
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
变得1
,false
变得0
。我们汇总数字,现在我们可以得到这些潜在总数中的任何一个:0、1、2 或 3。 我们只关心总共 1,我们可以从中减去 1 得到 0,然后取反它(这会迫使它回到布尔值),这使它true
。