JavaScript strcmp ()가 있습니까?


127

누구든지 나를 위해 이것을 확인할 수 있습니까? JavaScript에는 strcmp () 버전이 없으므로 다음과 같이 작성해야합니다.

 ( str1 < str2 ) ? 
            -1 : 
             ( str1 > str2 ? 1 : 0 );

당신은 혼자가 아닙니다- 다른 사람들이 전에 이것을 한 적이 있습니다 . PHP.JS 프로젝트 실제로뿐만 아니라, 다른 많은 일반적인 기능이을했다. 유용한 자료입니다.
리드 콥시

답변:


134

이건 어떤가요

str1.localeCompare(str2)

localeCompare ()는 좋아 보이지만 MS 전용이거나 표준이 아닌 것 같습니다.

10
어떤 표준을보고 있습니까? ECMA-262 표준 섹션 15.5.4.9 및 mozilla Javascript 참조 ( developer.mozilla.org/en/Core_JavaScript_1.5_Reference/… )에있는 것 같습니다.
newacct

newacct는 절대적으로 정확합니다. 이것은 ECMAScript 표준으로 보입니다. 아마도이 경우 가장 좋은 해결책 일 것입니다.
coderjoe

3
localeCompare()때로는 브라우저마다 다르게 동작합니다.
Varda Elentári

1
@ VardaElentári : 주어진 로케일에서 어휘 순서가없는 문자에만 해당됩니다. 문자의 경우 어떻게 그들이 사용하는 유니 코드의 어떤 부분 제한하지 않고 브라우저, 결과는 일관되고 있습니다 ECMA-402 및 유니 코드에 의해 정의 .
TJ Crowder

38

Javascript에는 지적한 바와 같이 없습니다.

빠른 검색이 이루어졌습니다.

function strcmp ( str1, str2 ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Waldo Malqui Silva
    // +      input by: Steve Hilder
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +    revised by: gorthaur
    // *     example 1: strcmp( 'waldo', 'owald' );
    // *     returns 1: 1
    // *     example 2: strcmp( 'owald', 'waldo' );
    // *     returns 2: -1

    return ( ( str1 == str2 ) ? 0 : ( ( str1 > str2 ) ? 1 : -1 ) );
}

에서 http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strcmp/

물론 필요한 경우 localeCompare를 추가 할 수 있습니다.

if (typeof(String.prototype.localeCompare) === 'undefined') {
    String.prototype.localeCompare = function(str, locale, options) {
        return ((this == str) ? 0 : ((this > str) ? 1 : -1));
    };
}

str1.localeCompare(str2)로컬 브라우저와 함께 제공되는 것에 대해 걱정할 필요없이 어디서나 사용할 수 있습니다. 유일한 문제는 당신이 지원을 추가해야한다는 것입니다 locales그리고options 당신이 그것에 대해 걱정합니다.


나는이 그것을 (polyfill FTW 특징 검출 등) 처리하는 좋은 방법이라고 생각하지만, 마이크로 속도 성능이 방법의 필요성에 관해서는, 그렇게 중요하다면, 나는 약간은 의아해하고 ==사용하지 ===후자 피하기 이후 타입 변환이므로 마이크로 초가 빠릅니다.
Tokimon

polyfill에 대한 참고 사항 – localeCompare는 대소 문자를 구분하지 않으므로 polyfill도 대소 문자를 구분하지 않으려면 다음과 같이하십시오. var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a > b) ? 1 : -1));
Kip

22

localeCompare()느린 당신이 영어 이외의 문자 문자열의 "올바른"주문에 대한 관심이 원래의 방법 또는 시도하지 않는 그렇다면, 클리너 보이는 :

str1 < str2 ? -1 : +(str1 > str2)

이것은 localeCompare()내 컴퓨터 보다 훨씬 빠릅니다 .

따라서 +답변은 항상 부울이 아닌 숫자가됩니다.


두 가지 버그 : str1 == str2에 대해 0을 반환하지 않음, str1> str2에 대해 1을 반환하지 않음
stackunderflow

2
@stackunderflow 정렬 기능에서 성공적으로 사용하고 있습니다. 어떤 버그가 발생 했습니까?
1 ''

1
이것은 -1, 0 또는 1 대신에 -1, false 또는 true를 리턴합니다. 항상 숫자를 리턴하도록하려면 다음과 같이 조정하십시오. str1 <str2? -1 : + (str1> str2)
jfren484

2
한 가지 더 (현재 코드에서 이것을 사용하고 있으므로 완벽하게 작성했습니다) : 이것은 대소 문자를 구분하는 비교입니다 ( 'Foo'는 'bar'앞에 있지만 ' 바는 'foo'다음에 올 것입니다). strcmp에 대한 OP의 질문에 해당하지만 많은 사람들이 대소 문자를 구분하지 않는 비교를 원할 수도 있습니다.
jfren484

5
여기에 더 청소기 보이는 표현이다 :(str1 > str2) - (str1 < str2)
조나단 길버트

2
var strcmp = new Intl.Collator(undefined, {numeric:true, sensitivity:'base'}).compare;

용법: strcmp(string1, string2)

결과 : 1string1이 더 크다는 0것을 의미하고, 같음을 -1의미하며, string2가 더 큼을 의미합니다.

이것은보다 성능이 높습니다 String.prototype.localeCompare

또한 numeric:true논리 숫자 비교를 수행합니다.



-1

어때요?

String.prototype.strcmp = function(s) {
    if (this < s) return -1;
    if (this > s) return 1;
    return 0;
}

그런 다음 s1을 2와 비교하려면

s1.strcmp(s2)

1
그들이 왜하지 말아야하는지 말하면 도움이 될 것입니다. 기존 함수 메소드의 작동 방식을 변경했는지 이해할 수 있지만이 경우 새 함수 메소드를 추가합니다.
키프로스에서 휴식

2
이와 같이 프로토 타입을 무조건 확장하는 것은 일반적으로 큰 문제가되지 않습니다.
Christopher
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.