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

What is the simplest way to compare truthiness in this specific way?

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

Write a function onlyOne that accepts three arguments of any type.

onlyOne should return true only if exactly one of the three arguments are truthy. Otherwise, it should return false.

Do not use the equality operators (== and ===) in your solution.

我的函数:

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));

您可以使用 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.