2

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

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

onlyOne仅当三个参数中的一个为真时才应返回真。否则,它应该返回 false。

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

我的功能:

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;
}
4

3 回答 3

4

我会调用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));

于 2018-07-19T05:10:43.643 回答
0

一个班轮:

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

!!将值强制转换为布尔值。将+布尔值强制转换为数字, where和truebecome 。我们将这些数字相加,现在我们可以得到这些潜在总数中的任何一个:0、1、2 或 3。我们只关心总数为 1,我们可以从中减去 1 得到 0,然后否定它(这会强制它回到一个布尔值)这使得它。1false0true

于 2018-07-19T06:25:31.703 回答
0

您可以使用filtercount如下。

filterCount函数中,第一个参数将决定您是否要 count oftruthyfalsy

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

于 2018-07-19T05:34:22.157 回答