with - w3schools javascript window




Como realizar uma classificação insensível a maiúsculas e minúsculas em JavaScript? (9)

Eu tenho uma matriz de strings que eu preciso classificar em JavaScript, mas de uma maneira que não diferencia maiúsculas de minúsculas. Como fazer isso?


É hora de rever essa velha questão.

Você não deve usar soluções com base no toLowerCase . Eles são ineficientes e simplesmente não funcionam em alguns idiomas (turco, por exemplo). Prefira isso:

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

Verifique a documentação de compatibilidade do navegador e tudo o que há para saber sobre a opção de sensitivity .


As outras respostas assumem que o array contém strings. Meu método é melhor, porque funcionará mesmo se a matriz contiver nulas, indefinidas ou outras não-strings.

var notdefined;
var myarray = ['a', 'c', null, notdefined, 'nulk', 'BYE', 'nulm'];

myarray.sort(ignoreCase);

alert(JSON.stringify(myarray));    // show the result

function ignoreCase(a,b) {
    return (''+a).toUpperCase() < (''+b).toUpperCase() ? -1 : 1;
}

O null será classificado entre 'nulk' e 'nulm'. Mas o undefined será sempre classificado por último.


Enrole suas cordas em / /i . Esta é uma maneira fácil de usar o regex para ignorar o invólucro


Enrolei a resposta principal em um polyfill para poder chamar o .sortIgnoreCase () em matrizes de string

// Array.sortIgnoreCase() polyfill
if (!Array.prototype.sortIgnoreCase) {
    Array.prototype.sortIgnoreCase = function () {
        return this.sort(function (a, b) {
            return a.toLowerCase().localeCompare(b.toLowerCase());
        });
    };
}

Normalize o caso no .sort() com .toLowerCase() .


Se você quiser garantir a mesma ordem, independentemente da ordem dos elementos na matriz de entrada, aqui está uma classificação stable :

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;
});

Você também pode usar o operador Elvis:

arr = ['Bob', 'charley', 'fudge', 'Fudge', 'biscuit'];
arr.sort(function(s1, s2){
    var l=s1.toLowerCase(), m=s2.toLowerCase();
    return l===m?0:l>m?1:-1;
});
console.log(arr);

Dá:

biscuit,Bob,charley,fudge,Fudge

O método localeCompare provavelmente está bem ...

Nota: O operador de Elvis é um 'operador ternário' de forma abreviada, se for o caso, normalmente com atribuição.
Se você olhar para o?: Lateralmente, parece que o Elvis ...
ou seja, em vez de:

if (y) {
  x = 1;
} else {
  x = 2;
}

você pode usar:

x = y?1:2;

isto é, quando y é verdadeiro, retorne 1 (para atribuição a x), caso contrário retorne 2 (para atribuição a x).


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

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

EDIT: Por favor, note que eu originalmente escrevi isso para ilustrar a técnica ao invés de ter desempenho em mente. Por favor, consulte também @Ivan Krechetov para uma solução mais compacta.





case-insensitive