How to perform case-insensitive sorting in JavaScript?

How to perform case-insensitive sorting in JavaScript?

I have an array of strings I need to sort in JavaScript, but in a case-insensitive way. How to perform this?


Solution 1:

In (almost 🙂 a one-liner

["Foo", "bar"].sort(function (a, b) {
    return a.toLowerCase().localeCompare(b.toLowerCase());

Which results in

[ 'bar', 'Foo' ]


["Foo", "bar"].sort();

results in

[ 'Foo', 'bar' ]

Solution 2:

  function(a, b) {
    if (a.toLowerCase() < b.toLowerCase()) return -1;
    if (a.toLowerCase() > b.toLowerCase()) return 1;
    return 0;

Please note that I originally wrote this to illustrate the technique rather than having performance in mind. Please also refer to answer @Ivan Krechetov for a more compact solution.

Solution 3:

It is time to revisit this old question.

You should not use solutions relying on toLowerCase. They are inefficient and simply don’t work in some languages (Turkish for instance). Prefer this:

['Foo', 'bar'].sort((a, b) => a.localeCompare(b, undefined, {sensitivity: 'base'}))

Check the documentation for browser compatibility and all there is to know about the sensitivity option.

Related:  My Bootstrap alert will not display after being closed

Solution 4:

arr.sort(function(a,b) {
    a = a.toLowerCase();
    b = b.toLowerCase();
    if (a == b) return 0;
    if (a > b) return 1;
    return -1;

Solution 5:

If you want to guarantee the same order regardless of the order of elements in the input array, here is a stable sorting:

myArray.sort(function(a, b) {
    /* Storing case insensitive comparison */
    var comparison = a.toLowerCase().localeCompare(b.toLowerCase());
    /* If strings are equal in case insensitive comparison */
    if (comparison === 0) {
        /* Return case sensitive comparison instead */
        return a.localeCompare(b);
    /* Otherwise return result */
    return comparison;

Solution 6:

You can also use the new Intl.Collator().compare, per MDN it’s more efficient when sorting arrays. The downside is that it’s not supported by older browsers. MDN states that it’s not supported at all in Safari. Need to verify it, since it states that Intl.Collator is supported.

When comparing large numbers of strings, such as in sorting large arrays, it is better to create an Intl.Collator object and use the function provided by its compare property

["Foo", "bar"].sort(Intl.Collator().compare); //["bar", "Foo"]