首页 > 解决方案 > > / < / === 三路比较而不必多次写入比较值?

问题描述

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

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

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

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

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

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被替换为表达式。

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

标签: javascriptecmascript-6

解决方案


您可以只进行一次比较并返回其中一个'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));


推荐阅读