Reputation: 19242
I'm trying to compare 2 strings alphabetically for sorting purposes. For example I want to have a boolean check like if('aaaa' < 'ab')
. I tried it, but it's not giving me correct results, so I guess that's not the right syntax. How do I do this in jquery or Javascript?
Upvotes: 155
Views: 186712
Reputation: 15907
You do say that the comparison is for sorting purposes. Then I suggest localeCompare instead:
"a".localeCompare("b");
It returns -1
since "a" < "b"
, 1
or 0
otherwise, like you need for Array.prototype.sort()
Keep in mind that sorting is locale dependent. E.g. in German, ä
is a variant of a
, so "ä".localeCompare("b", "de-DE")
returns -1
. In Swedish, ä
is one of the last letters in the alphabet, so "ä".localeCompare("b", "sv-SE")
returns 1
.
Without the second parameter to localeCompare
, the browser's locale is used. Which in my experience is never what I want, because then it'll sort differently than the server, which has a fixed locale for all users.
Also, if what you are sorting contains numbers, you may want:
"a5b".localeCompare("a21b", undefined, { numeric: true })
This returns -1, recognizing that 5 as a number is less than 21. Without { numeric: true }
it returns 1, since "2" sorts before "5". In many real-world applications, users expect "a5b" to come before "a21b".
Upvotes: 239
Reputation: 313
Let's say we have an array of objects such as:
{ name: String }
then we can sort our array as follows:
array.sort((a, b) => {
if (a.name === b.name) return 0;
return a.name > b.name ? 1 : -1;
});
Note: Be careful with uppercase letters. You may need to cast your string to lowercase depending on the purpose.
Upvotes: 12
Reputation: 1110
Just remember that string comparison like "x" > "X" is case-sensitive
"aa" < "ab" //true
"aa" < "Ab" //false
You can use .toLowerCase()
to compare without case sensitivity.
Upvotes: 35
Reputation: 193
"a".localeCompare("b")
should actually return -1
since a
sorts before b
http://www.w3schools.com/jsref/jsref_localecompare.asp
Upvotes: 8
Reputation: 47966
Lets look at some test cases - try running the following expressions in your JS console:
"a" < "b"
"aa" < "ab"
"aaa" < "aab"
All return true.
JavaScript compares strings character by character and "a" comes before "b" in the alphabet - hence less than.
In your case it works like so -
1 . "aaaa" < "ab"
compares the first two "a" characters - all equal, lets move to the next character.
2 . "aaaa" < "ab"
compares the second characters "a" against "b" - whoop! "a" comes before "b". Returns true.
Upvotes: 148