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;
}
}
The strict equality operator ( === ) checks whether its two operands are equal, returning a Boolean result. Unlike the equality operator, the strict equality operator always considers operands of different types to be different.
In PHP 7, a new feature, spaceship operator has been introduced. It is used to compare two expressions. It returns -1, 0 or 1 when first expression is respectively less than, equal to, or greater than second expression.
In JavaScript, there are two types of comparison operators: Type-converting (or Abstract) Strict.
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).
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;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With