假设您得到A,并希望将其与B进行比较。有时您可以检查A<B,有时您需要检查AB。您希望在一个方法中实现这一点,该方法将某种形式的"比较类型"作为其参数之一。对于如何做到这一点,是否有"最佳实践"?
为了清楚起见,我现在提供了一个如何做到这一点的例子。当传入a标志时,比较方法为"大于",反之亦然。
function func(a, b, c) {
var cmp = a ? gt : lt;
if (cmp(b, c)) {
return 'Hi';
}
return 'Bye';
}
function lt(a, b) {
return a < b;
}
function gt(a, b) {
return a > b;
}
当您需要在升序和降序之间进行选择时,我通常会在处理排序时这样做:
var cmp = a ? 1 : -1
if(b*cmp > c*cmp){ // not sure if you want a > or a < here
return 'Hi'
}else{
return 'Bye'
}
一个简短的版本是使用带xor的布尔逻辑:(注意,对于b==c的情况,它给出了错误的结果)
function func(a, b, c) {
if ((b > c)^!a) {
return 'Hi';
}
return 'Bye';
}
说明:若你们制作了一张有4种可能性的表格,你们就得到了:
a|b>c|预期输出
true|true|Hi-
true|false|再见
false | true |再见
false|false|Hi-
如果你认为Hi为真,Bye为假,如果a和b>c相等,你想要一个真,如果不相等,你就想要一个假。Xor做了类似的事情,如果2相等,则给出false,如果它们不同,则给出true。反过来,我们得到了我们想要的结果
若你们制作了相同的表格,但考虑到了相同的情况,你们可能会得到这样的结果:
function func(a, b, c) {
if(b == c || (b > c)^a){
return 'Bye'
}
return 'Hi'
}
这个怎么样?
if((a && b > c) || (!a && b < c)) {
return 'Hi';
} else {
return 'Bye';
}
我认为这仍然易于阅读和理解,涵盖了所描述的需求,并使代码简洁无重复。