【问题标题】:> / < / === three way comparison without having to write the compared values more than once?> / < / === 三路比较而不必多次写入比较值?
【发布时间】:2019-09-07 20:33:36
【问题描述】:

我正在尝试为需要三个可能的不同返回值的问题编写解决方案,具体取决于两个值的结果。可能性有大于小于等于。一个简单易懂的写法是:

function compare(x, y) {
  if (x < y) return y;
  if (x > y) return x;
  if (x === y) return 'equal';
}

我一直试图弄清楚是否有办法通过减少代码中xyifreturn 的出现次数来编写此代码。例如,如果我不检查===,那么我可以消除if 并将return 减少为一种用途:

function compare(x, y) {
  return x > y ? x : y;
}

=== 添加回这个三元返回比较笨拙,当有两种以上的可能性时,我不喜欢使用三元运算符。如果将xy 替换为长表达式,这可能真的很难阅读:

function compare(x, y) {
  return x === y ? 'equal' : x > y ? x : y;
}

我也可以:

function compare(x, y) {
  if (x !== y) {
    return x > y ? x : y;
  }
  return 'equal';
}

这可能比上面的函数更具可读性,特别是如果 xy 被替换为表达式。

在这种情况下使用开关可能是矫枉过正——但也许不是?有其他解决方案吗?有没有办法存储比较xy 的结果,然后检查该值是什么?到那时还值得吗?

【问题讨论】:

  • 我想我更喜欢你的最后一个代码,除了我会检查 ===return 'equal' 块内的 positive if 块(看起来是 更好的国际海事组织)。您可以将嵌套的条件分隔到多行以使其更具可读性,但不幸的是它并没有让 that 更具可读性。 IMO switch肯定会更糟,它非常冗长且容易出错
  • 你的第一个函数是多余的。您可以在前两个 if 语句之后使用 return 'equal'。第二个功能有点难以阅读。我会使用第一个或第三个函数。
  • 如果有超过 3 个条件,你可以用某种数组或对象来概括并使事情 DRY,但只有 3 个条件,它并不值得
  • const compare = (x, y) =&gt; x === y ? 'equal' : Math.max(x, y) 这对我来说更具可读性。
  • 您是否考虑过xy 既不相等、不小也不大的情况——例如如果其中一个或两个是NaN?请注意,您的第一个解决方案确实返回了一个 fourthundefined,这可能是不可取的。

标签: javascript ecmascript-6


【解决方案1】:

您可以只进行一次比较并返回'equal' 或最大值。

function compare(x, y) {
    return x === y
        ? 'equal'
        : Math.max(x, y);
}

console.log(compare(1, 2));
console.log(compare(2, 2));
console.log(compare(2, 1));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 2017-07-21
    • 2016-05-22
    • 2021-11-18
    • 1970-01-01
    • 2013-02-19
    相关资源
    最近更新 更多