একটি জাভাস্ক্রিপ্ট strcmp () আছে?


127

কেউ কি আমার জন্য এটি যাচাই করতে পারবেন? জাভাস্ক্রিপ্টে strcmp () এর সংস্করণ নেই, সুতরাং আপনাকে এরকম কিছু লিখতে হবে:

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

আপনি একা নন - অন্য লোকেরা এর আগেও এটি করেছেPHP.JS প্রকল্পের আসলে অনেক অন্যান্য সাধারণ কাজকর্মের জন্য এরূপ ব্যবহার কে করল, পাশাপাশি। এটি একটি সহজ সংস্থান।
রিড কোপসি

উত্তর:


134

কি সম্পর্কে

str1.localeCompare(str2)

লোকালকম্পার () দেখতে ভাল লাগছিল তবে দেখে মনে হচ্ছিল এটি কেবলমাত্র এমএস-এর মতো, না মানের ক্ষেত্রে সেরা।

10
তুমি কোন স্ট্যান্ডার্ডের দিকে তাকাচ্ছ? এটা মজিলা জাভাস্ক্রিপ্ট রেফারেন্স (এ, ECMA-262 মানক বিভাগ 15.5.4.9 করা এবং সেইসাথে মনে হয় developer.mozilla.org/en/Core_JavaScript_1.5_Reference/... )
newacct

newacct একেবারে সঠিক। এটি ECMAScript মান বলে মনে হচ্ছে। সম্ভবত এই ক্ষেত্রে সেরা সমাধান।
কোডারজয় 21

3
localeCompare()কখনও কখনও প্রতিটি ব্রাউজারে আলাদা আচরণ করে।
বর্দা এলেন্ত্রি

1
@ ভারদাএলেন্ট্রি: কেবলমাত্র এমন অক্ষরগুলির জন্য যা প্রদত্ত লোকালে কোনও লেজিকাল ক্রম নেই। কিছু অক্ষর আছে যা জন্য কি করতে এবং ব্রাউজারের সীমিত না ইউনিকোড কী অংশের তারা ব্যবহার, ফলাফল সামঞ্জস্যপূর্ণ এবং হয় ECMA-402 এবং ইউনিকোড দ্বারা সংজ্ঞায়িত
টিজে ক্রাউডার

38

জাভাস্ক্রিপ্ট এটি নেই, আপনি উল্লেখ হিসাবে।

একটি দ্রুত অনুসন্ধান আসে:

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/ জাভাস্ক্রিপ্ট_ইকুইভ্যালেন্ট_ফর্ম_এইচপিএস_স্ট্রিএমপি / থেকে

অবশ্যই, প্রয়োজন হলে আপনি কেবল লোকালক্যাম্পার যুক্ত করতে পারেন:

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 যদি আপনি সে সম্পর্কে যত্নশীল হন।


আমি মনে করি এটি পরিচালনা করার জন্য এটি একটি দুর্দান্ত উপায় (বৈশিষ্ট্য সনাক্তকরণ এবং পলিফিল এফটিডব্লু), তবে যদি এই পদ্ধতির প্রয়োজন হিসাবে মাইক্রো স্পিড পারফরম্যান্সটি এতটা গুরুত্বপূর্ণ হয় তবে আমি সামান্য বিস্মিত হই ==যা ব্যবহার করা হয় এবং ===পরেরটি এড়াতে হয় না রূপান্তর টাইপ করুন এবং তাই যে মাইক্রো দ্বিতীয় দ্রুত।
টোকিমন

পলিফিলের উপর একটি নোট - লোকালকম্পারটি কেস-সংবেদনশীল নয়, তাই পলিফিলকে কেস-সংবেদনশীল না করার জন্য আপনি কিছু করতে পারেন যেমন- var a = this.toUpperCase(); var b = str.toUpperCase(); return ((a == b) ? 0 : ((a > b) ? 1 : -1));
কিপ

22

localeCompare()ধীর গতির , সুতরাং যদি আপনি অ-ইংলিশ-অক্ষরযুক্ত স্ট্রিংয়ের "সঠিক" ক্রমটির বিষয়ে চিন্তা না করেন তবে আপনার আসল পদ্ধতিটি বা ক্লিনার দেখানোর চেষ্টা করুন:

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

এটি localeCompare()আমার মেশিনের চেয়ে দ্রুততার একটি ক্রম ।

+নিশ্চিত করে যে উত্তর সবসময় বদলে সাংখ্যিক বুলিয়ান।


দুই বাগ: str1 == str2 জন্য 0 ফেরত দেয় না, str1> str2 জন্য ফেরত দেয় না 1
stackunderflow

2
পছন্দ করুন আপনি যে বাগটি ব্যবহার করছেন তা কী?
1 ''

1
এটি -1, 0, বা 1 -1 এর পরিবর্তে -1, মিথ্যা, বা সত্যটি ফিরে আসবে, সর্বদা এটির সংখ্যা ফিরিয়ে আনতে, এটির মতো এটি টুইট করুন: str1 <str2? -1: + (str1> str2)
jfren484

2
আরও একটি জিনিস (আমি এই মুহুর্তে কোডে লিখছি, তাই আমি এটি নিখুঁত করছি): কেবল সচেতন হন যে এটি কেস-সংবেদনশীল তুলনা ('ফু' 'বার' এর আগে আসবে তবে ' বার 'ফু'র পরে আসবে)। এটি টিআরসিএমপি সম্পর্কিত ওপির প্রশ্নের সাথে মিলে যায় তবে অনেক লোক এখানে কেস-অজোনস্টিক তুলনা খুঁজছেন।
jfren484

5
এখানে আরও পরিষ্কার-পরিচ্ছন্ন অভিব্যক্তি:(str1 > str2) - (str1 < str2)
জোনাথন গিলবার্ট

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

ব্যবহার: strcmp(string1, string2)

ফলাফল: 1মানে স্ট্রিং 1 বড়, 0সমান -1অর্থ, স্ট্রিং 2 এর চেয়ে বড়।

এর চেয়ে বেশি পারফরম্যান্স রয়েছে String.prototype.localeCompare

এছাড়াও, numeric:trueএটি যৌক্তিক সংখ্যার তুলনা করে makes



-1

কেমন:

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

তারপরে, এস 1 এর সাথে 2 এর সাথে তুলনা করুন:

s1.strcmp(s2)

1
আপনি যদি বলেন যে তারা কেন করেছে তা তাদের করা উচিত না যদি এটি সাহায্য করবে। আমি বুঝতে পারি যে তারা কীভাবে বিদ্যমান ফাংশন পদ্ধতিটি কাজ করে তা পরিবর্তন করে তবে এই ক্ষেত্রে তারা একটি নতুন যুক্ত করছে।
সাইপ্রাসে

2
শর্তহীনভাবে প্রোটোটাইপগুলি প্রসারিত করা সাধারণত একটি বড় নম্বর is
ক্রিস্টোফার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.