[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().compare
MDN을 사용하여 배열을 정렬 할 때 더 효율적 입니다. 단점은 이전 브라우저에서 지원하지 않는다는 것입니다. 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()
.