[javascript] JavaScript에서 대소 문자를 구분하지 않는 정렬을 수행하는 방법은 무엇입니까?

JavaScript로 정렬해야하지만 대소 문자를 구분하지 않는 문자열 배열이 있습니다. 이것을 수행하는 방법?



답변

(거의 🙂 하나의 라이너

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

어떤 결과

[ 'bar', 'Foo' ]

동안

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

결과

[ 'Foo', 'bar' ]


답변

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

편집 :
나는 원래 성능을 염두에두기보다는 기술을 설명하기 위해 이것을 썼습니다. 보다 컴팩트 한 솔루션에 대해서는 @Ivan Krechetov의 답변을 참조하십시오.


답변

이 오래된 질문을 다시 볼 때입니다.

의존하는 솔루션을 사용해서는 안됩니다 toLowerCase. 그들은이다 비효율적 간단하게 작동하지 않는 일부 언어 (예를 들어 터키어)에서. 이것을 선호하십시오 :

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

브라우저 호환성에 대한 설명서 를 확인하고 sensitivity옵션 에 대한 모든 정보 를 확인하십시오 .


답변

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


답변

새로운 Intl.Collator().compareMDN을 사용하여 배열을 정렬 할 때 더 효율적 입니다. 단점은 이전 브라우저에서 지원하지 않는다는 것입니다. MDN은 Safari에서 전혀 지원되지 않는다고 말합니다. Intl.Collator지원됨을 나타내므로 확인해야합니다 .

큰 배열 정렬과 같이 많은 수의 문자열을 비교할 때는 Intl.Collator 객체를 만들고 compare 속성에서 제공하는 함수를 사용하는 것이 좋습니다

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


답변

입력 배열의 요소 순서에 관계없이 동일한 순서를 보장하려면 안정적인 정렬이 있습니다.

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


답변

의 경우 정상화 .sort()와를 .toLowerCase().