【发布时间】: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';
}
我一直试图弄清楚是否有办法通过减少代码中x、y、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';
}
这可能比上面的函数更具可读性,特别是如果 x 和 y 被替换为表达式。
在这种情况下使用开关可能是矫枉过正——但也许不是?有其他解决方案吗?有没有办法存储比较x 和y 的结果,然后检查该值是什么?到那时还值得吗?
【问题讨论】:
-
我想我更喜欢你的最后一个代码,除了我会检查
===和return 'equal'块内的 positiveif块(看起来是 位更好的国际海事组织)。您可以将嵌套的条件分隔到多行以使其更具可读性,但不幸的是它并没有让 that 更具可读性。 IMOswitch肯定会更糟,它非常冗长且容易出错 -
你的第一个函数是多余的。您可以在前两个 if 语句之后使用
return 'equal'。第二个功能有点难以阅读。我会使用第一个或第三个函数。 -
如果有超过 3 个条件,你可以用某种数组或对象来概括并使事情 DRY,但只有 3 个条件,它并不值得
-
const compare = (x, y) => x === y ? 'equal' : Math.max(x, y)这对我来说更具可读性。 -
您是否考虑过
x和y既不相等、不小也不大的情况——例如如果其中一个或两个是NaN?请注意,您的第一个解决方案确实返回了一个 fourth 值undefined,这可能是不可取的。