代码之家  ›  专栏  ›  技术社区  ›  CalamityAdam

用这种特定的方式比较真理最简单的方法是什么?

  •  2
  • CalamityAdam  · 技术社区  · 7 年前

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

    编写函数 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;
    }
    
    3 回复  |  直到 7 年前
        1
  •  4
  •   CertainPerformance    7 年前

    我会打电话 Boolean 每一个论点 reduce 变成一个数字,然后检查这个数字减去1的真实性:

    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 提供给的初始值 减少 以下内容:

    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));
        2
  •  0
  •   Karan    7 年前

    你可以用 filter count 如下所示。

    filterCount 函数first参数将决定是否要计数 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));
        3
  •  0
  •   pretzelhammer Paras Bhattrai    7 年前

    一行:

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

    !! 将值强制为布尔值。 + 将布尔人强制变成数字,其中 true 变成 1 false 变成 0 . 我们把这些数字加起来,现在我们可以得到这些潜在的总数中的任何一个:0、1、2或3我们只关心1的总数,我们可以从中减去1得到0,然后求反它(这会强制它返回到布尔值),从而使它 真的 . 这是我设计的解决方案,但在这个stackoverflow问题中,您可以找到其他方法: xor with 3 values

    推荐文章