问题
Ruby has something called a Combined Comparison or "Spaceship" Operator, it looks like this: <=>
It does the following:
a <=> b :=
if a < b then return -1
if a = b then return 0
if a > b then return 1
Credit
Is there a similar Operator in Javascript? If not, how can I end up with the same result?
@madox2 suggested using Math.sign(a - b)
, which works for number, but not arrays (to compare arrays you need to use array.length
).
It also does not work in Internet Explorer, Safari or all Mobile Browsers (see MDN)
@duques_l found a function here. It works very well, you can test it on JSFiddle
The only problem is if the strings are not comparable the function returns -1
instead of nil
Update: @duques_l changed the function a bit and now it works fine (I think so anyway, here is the JSFiddle):
function spaceship(val1, val2) {
if ((val1 === null || val2 === null) || (typeof val1 != typeof val2)) {
return null;
}
if (typeof val1 === 'string') {
return (val1).localeCompare(val2);
}
else {
if (val1 > val2) { return 1 }
else if (val1 < val2) { return -1 }
return 0;
}
}
回答1:
As far as I know there is no such operator in JavaScript but you can use Math.sign() function:
Math.sign(a - b);
NOTE: As was mentioned in comments, Math.sign() is not currently supported by all browsers. Check for compatibility (MDN).
回答2:
from: http://sabrelabs.com/post/48201437312/javascript-spaceship-operator
improved version:
function spaceship(val1, val2) {
if ((val1 === null || val2 === null) || (typeof val1 != typeof val2)) {
return null;
}
if (typeof val1 === 'string') {
return (val1).localeCompare(val2);
} else {
if (val1 > val2) {
return 1;
} else if (val1 < val2) {
return -1;
}
return 0;
}
}
来源:https://stackoverflow.com/questions/34852855/combined-comparison-spaceship-operator-in-javascript