Soru JavaScript strcmp () var mı?


Bunu benim için herkes doğrulayabilir mi? JavaScript'in strcmp () bir sürümü yok, bu yüzden aşağıdaki gibi bir şeyler yazmalısınız:

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

109
2017-07-24 18:30


Menşei


Yalnız değilsin - diğer insanlar bunu daha önce yapmış. PHP.JS projesi Aslında bunu diğer birçok ortak işlev için de yaptı. Bu kullanışlı bir kaynak. - Reed Copsey


Cevaplar:


Ne dersin

str1.localeCompare(str2)

112
2017-07-24 18:38



localeCompare () iyi görünüyordu, ama sadece MS'e benziyordu ya da en iyi standartta değildi.
Hangi standarda bakıyorsun? mozilla Javascript referansında olduğu gibi ECMA-262 standart bölüm 15.5.4.9'da olduğu görülmektedir (developer.mozilla.org/en/Core_JavaScript_1.5_Reference/...) - newacct
newacct kesinlikle doğrudur. Bu ECMAScript standardı gibi görünüyor. Muhtemelen bu durumda en iyi çözüm. - coderjoe
localeCompare() bazen her tarayıcıda farklı davranır. - Varda Elentári
@ VardaElentári: Yalnızca belirli yerel ayarlarda sözcüksel düzenleri olmayan karakterler için. Karakterler için yap ve hangi Unicode parçasını kullandıklarını kısıtlamayan tarayıcılar, sonuçlar tutarlı ve ECMA-402 ve Unicode tarafından tanımlanmış. - T.J. Crowder


Javascript, işaret ettiğin gibi, sahip değil.

Hızlı bir arama ile geldi:

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

itibaren http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strcmp/

Elbette, gerekirse sadece localeCompare ekleyebilirsin:

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

Ve kullan str1.localeCompare(str2) Her yerde, yerel tarayıcı onunla birlikte gönderilip gönderilmediğine bakmaksızın. Tek sorun şu ki; locales ve options eğer bunu önemsersen


34
2017-07-24 18:34



Bunun iyi bir yöntem olduğunu düşünüyorum (özellik tespiti ve polyfill FTW), fakat eğer mikro hız performansı çok önemliyse, bu yönteme ihtiyaç duyulduğunda, o zaman biraz şaşkınım. == kullanılır ve değil === İkincisi, tip dönüşümünü engellediğinden ve dolayısıyla mikro saniye daha hızlıdır. - Tokimon


localeCompare() yavaşBu nedenle, ingilizce olmayan karakter dizelerinin "doğru" sırasını umursamıyorsanız, özgün yönteminizi veya daha temiz görünen birini deneyin:

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

Bu, daha büyük bir büyüklük sırasına göre localeCompare() benim makinemde.

+ yanıtın boolean yerine her zaman sayısal olmasını sağlar.


16
2017-07-20 18:10



İki hata: str1 == str2 için 0 değil, str1> str2 için 1 döndürmez - stackunderflow
@stackunderflow Bu durumlarda geri dönmesini öneriyor musunuz? - 1''
@stackunderflow Bir sıralama fonksiyonunda başarıyla kullanıyorum. Yaşadığınız böcek nedir? - 1''
Bir şey daha var (bunu şu anda yazdığım kodda kullanıyorum, bu yüzden mükemmelleştiriyorum): sadece bunun büyük / küçük harfe duyarlı bir karşılaştırma olduğunu unutmayın ('Foo', 'bar' dan önce gelir ama ' Bar 'foo' sonra gelecek. Bu OP'nin strcmp ile ilgili sorusuna karşılık gelir, ancak birçok kişi burada bir vaka-agnostik karşılaştırma aramak için gelebilir. - jfren484
İşte daha temiz görünümlü bir ifade: (str1 > str2) - (str1 < str2) - Jonathan Gilbert


Nasıl hakkında:

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

Daha sonra, s1'i 2 ile karşılaştırmak için:

s1.strcmp(s2)

3
2018-06-12 14:55



Neden yaptıklarını yapmamaları gerektiğini söylediyseniz yardımcı olur. Mevcut bir fonksiyon yönteminin nasıl çalıştığını değiştirip değiştirmediklerini anlayabiliyordum, ama bu durumda yeni bir tane ekliyorlar. - Relaxing In Cyprus