सवाल जावास्क्रिप्ट में समाप्त होता है


जावास्क्रिप्ट में एक विशेष चरित्र के साथ एक स्ट्रिंग समाप्त होने पर मैं कैसे जांच सकता हूं?

उदाहरण: मेरे पास एक स्ट्रिंग है

var str = "mystring#";

मैं जानना चाहता हूं कि क्या स्ट्रिंग समाप्त हो रही है या नहीं #। मैं इसे कैसे देख सकता हूं?

  1. वहां एक endsWith() जावास्क्रिप्ट में विधि?

  2. मेरे पास एक समाधान स्ट्रिंग की लंबाई लेता है और अंतिम चरित्र प्राप्त करता है और इसे जांचता है।

क्या यह सबसे अच्छा तरीका है या कोई और तरीका है?


1015
2017-11-11 11:15


मूल


यह एक संबंधित सवाल होना चाहिए: stackoverflow.com/questions/646628/javascript-startswith - Hamish Grubijan
यहाँ एक है ES6 के लिए पूरी तरह से spec-compliant polyfill String.prototype.endsWith। - Mathias Bynens


जवाब:


अद्यतन (24 नवंबर, 2015):

यह उत्तर मूल रूप से वर्ष 2010 (छह साल पहले) में पोस्ट किया गया है, इसलिए कृपया इन अंतर्दृष्टिपूर्ण टिप्पणियों पर ध्यान दें:

  • शौना - Googlers के लिए अद्यतन - ऐसा लगता है कि ECMA6 इस फ़ंक्शन को जोड़ता है। एमडीएन लेख भी एक पॉलीफिल दिखाता है। https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/endsWith

  • टी.जे. Crowder - आधुनिक ब्राउज़रों पर सबस्ट्रिंग बनाना महंगा नहीं है; यह 2010 में हो सकता है जब यह उत्तर पोस्ट किया गया था। इन दिनों, सरल this.substr(-suffix.length) === suffix क्रोम पर दृष्टिकोण सबसे तेज़ है, आईई 11 पर इंडेक्स के रूप में, और फ़ायरफ़ॉक्स पर केवल 4% धीमी (fergetaboutit क्षेत्र): jsperf.com/endswith-stackoverflow/14 और जब परिणाम गलत होता है तो बोर्ड में तेज़ी से: jsperf.com/endswith-stackoverflow-when-false  बेशक, ES6 जोड़ना समाप्त होता है, बिंदु बिंदु है। :-)


मूल उत्तर:

मुझे पता है कि यह एक साल का सवाल है ... लेकिन मुझे इसकी भी आवश्यकता है और मुझे इसे क्रॉस-ब्राउजर काम करने की ज़रूरत है ... हर किसी के जवाब और टिप्पणियों का संयोजन और इसे थोड़ा सा सरल बनाना:

String.prototype.endsWith = function(suffix) {
    return this.indexOf(suffix, this.length - suffix.length) !== -1;
};
  • एक सबस्ट्रिंग नहीं बनाता है
  • मूल का उपयोग करता है indexOf सबसे तेज़ परिणामों के लिए समारोह
  • दूसरे पैरामीटर का उपयोग करके अनावश्यक तुलना छोड़ें indexOf आगे छोड़ने के लिए
  • इंटरनेट एक्सप्लोरर में काम करता है
  • कोई Regex जटिलताओं

इसके अलावा, अगर आपको मूल डेटा संरचना के प्रोटोटाइप में चीजें भरना पसंद नहीं है, तो यह एक स्टैंडअलोन संस्करण है:

function endsWith(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
}

संपादित करें: टिप्पणियों में @hamish द्वारा नोट किया गया है, यदि आप सुरक्षित पक्ष पर गलती करना चाहते हैं और जांच करें कि कोई कार्यान्वयन पहले से ही प्रदान किया गया है, तो आप केवल एक जोड़ सकते हैं typeof इस तरह की जांच करें:

if (typeof String.prototype.endsWith !== 'function') {
    String.prototype.endsWith = function(suffix) {
        return this.indexOf(suffix, this.length - suffix.length) !== -1;
    };
}

1704
2018-03-30 19:40



Googlers के लिए अद्यतन - ऐसा लगता है कि ECMA6 इस फ़ंक्शन को जोड़ता है। एमडीएन लेख भी एक पॉलीफिल दिखाता है। developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/... - Shauna
@ lukas.pukenis यह अंत तक छोड़ देता है और केवल अंत में प्रत्यय के एक उदाहरण की जांच करता है। इससे कोई फर्क नहीं पड़ता कि खोज स्ट्रिंग कहीं और दिखाई देती है। - chakrit
स्थिति के लिए एक चेक जोड़ना जब तर्क "प्रत्यय" परिभाषित नहीं किया गया है ": अगर (टाइपिंग स्ट्रिंग.प्रोटोटाइप.एंड्स विथ! == 'फ़ंक्शन') {String.prototype.endsWith = function (प्रत्यय) {this.indexOf (प्रत्यय को वापस करें , यह। लम्बाई - ((प्रत्यय और प्रत्यय। लम्बाई) || 0))! == -1;};} - Mandeep
आपके द्वारा संदर्भित रेगेक्स जटिलताओं क्या हैं? - IcedDante
आधुनिक ब्राउज़रों पर सबस्ट्रिंग बनाना महंगा नहीं है; यह 2010 में हो सकता है जब यह उत्तर पोस्ट किया गया था। इन दिनों, सरल this.substr(-suffix.length) === suffix क्रोम पर दृष्टिकोण सबसे तेज़ है, आईई 11 के समान है indexOf, और फ़ायरफ़ॉक्स पर केवल 4% धीमी (fergetaboutit क्षेत्र): jsperf.com/endswith-stackoverflow/14 और जब परिणाम गलत होता है तो बोर्ड में तेज़ी से: jsperf.com/endswith-stackoverflow-when-false बेशक, ES6 जोड़ के साथ endsWith, मुद्दा मंथन है। :-) - T.J. Crowder


/#$/.test(str)

सभी ब्राउज़रों पर काम करेगा, बंदर पैचिंग की आवश्यकता नहीं है String, और पूरे स्ट्रिंग को स्कैन करने की आवश्यकता नहीं है lastIndexOf जब कोई मैच नहीं होता है।

यदि आप निरंतर स्ट्रिंग से मेल खाना चाहते हैं जिसमें नियमित अभिव्यक्ति विशेष वर्ण हो सकते हैं, जैसे कि '$', तो आप निम्न का उपयोग कर सकते हैं:

function makeSuffixRegExp(suffix, caseInsensitive) {
  return new RegExp(
      String(suffix).replace(/[$%()*+.?\[\\\]{|}]/g, "\\$&") + "$",
      caseInsensitive ? "i" : "");
}

और फिर आप इसे इस तरह इस्तेमाल कर सकते हैं

makeSuffixRegExp("a[complicated]*suffix*").test(str)

285
2018-03-24 20:32



यदि आप निरंतर सबस्ट्रिंग की जांच कर रहे हैं तो यह अच्छा और सरल है। - Warren Blanchet
आखिरी इंडेक्स क्या सभी स्ट्रिंग स्कैन करता है? मैंने सोचा कि यह अंत तक भिखारी से खोज करेगा। - Tom Brito
@TomBrito, lastIndexOf पूरी स्ट्रिंग को तभी स्कैन करता है जब उसे कोई मिलान न मिले, या शुरुआत में एक मैच मिल जाए। यदि अंत में एक मैच है तो यह प्रत्यय की लंबाई के अनुपात में आनुपातिक कार्य करता है। हाँ, /asdf$/.test(str)जब सही साबित होता है str इसी के साथ समाप्त होता है "asdf"। - Mike Samuel
@ टॉम ब्रिटो, यह एक नियमित अभिव्यक्ति शाब्दिक है। सिंटैक्स पर्ल से उधार लिया जाता है। देख developer.mozilla.org/en/Core_JavaScript_1.5_Guide/... या विस्तार के अनावश्यक स्तर के लिए, एक्मास्क्रिप्ट भाषा विनिर्देश के अनुभाग 7.8.5 देखें। - Mike Samuel
क्रॉस-ब्राउज़र संगतता के लिए +1। क्रोम 28.0.1500.72 मीटर, फ़ायरफ़ॉक्स 22.0, और आईई 9 पर परीक्षण किया गया। - Adrien Be


  1. दुर्भाग्य से नहीं।
  2. if( "mystring#".substr(-1) === "#" ) {}

82
2017-11-11 11:20



हालांकि यह इंटरनेट एक्सप्लोरर में काम नहीं करेगा। - Anthony
@ एंथनी, उम ... तो उपयोग करें। लम्बाई -1, समस्या क्या है? अगर (mystring.substr (mystring.length-1) === "#") {} आईई में ठीक काम करता है। - BrainSlugs83
@ BrainSlugs83 - यह बिल्कुल समस्या है: '। लम्बाई -1' वाक्यविन्यास आईई में काम करता है, और '-1' वाक्यविन्यास नहीं करता है। यह ध्यान में रखना कुछ है, इसलिए टिप के लिए एंथनी को +1 करें। - egasimus
आप उपयोग नहीं कर सका slice()? यह मेरे त्वरित आईई 7 परीक्षण में मेरे लिए काम करता है। - alex
mystring [mystring.length-1] === '#'। किसी भी ब्राउज़र में काम करता है - ferronrsmith


चलो, यह सही है endsWith कार्यान्वयन:

String.prototype.endsWith = function (s) {
  return this.length >= s.length && this.substr(this.length - s.length) == s;
}

का उपयोग करते हुए lastIndexOf यदि कोई मैच नहीं है तो बस अनावश्यक सीपीयू लूप बनाता है।


66
2017-09-27 08:34



माना। मुझे वास्तव में ऐसा लगता है कि यह सबसे प्रचलित समाधान है क्योंकि इसकी शुरुआती गर्भपात / सैनिटी जांच है, यह छोटा और संक्षिप्त है, यह सुरुचिपूर्ण है (स्ट्रिंग प्रोटोटाइप ओवरलोडिंग) और सबस्ट्रिंग रेगेक्स इंजन को कताई करने से संसाधन संसाधन के बहुत कम लगता है। - BrainSlugs83
इस समाधान की तरह भी। बस फ़ंक्शन का नाम गलत वर्तनी है। "समाप्त होता है" होना चाहिए। - xmedeko
@ BrainSlugs83 यह कुछ सालों से रहा है, लेकिन अब यह विधि चक्रृत द्वारा उपरोक्त वर्णित 'इंडेक्सऑफ' विधि से अधिक तेज नहीं है, और सफारी के तहत, यह 30% धीमी है! 50-वर्ण स्ट्रिंग के बारे में विफलता के मामले के लिए यहां एक जेएसपीआरएफ परीक्षण है: jsperf.com/endswithcomparison - Brent Faust
शायद उपयोग करना चाहिए === हालांकि। - Timmmm


यह संस्करण एक सबस्ट्रिंग बनाने से बचाता है, और नियमित अभिव्यक्तियों का उपयोग नहीं करता है (यहां कुछ रेगेक्स उत्तर काम करेंगे; अन्य टूटे हुए हैं):

String.prototype.endsWith = function(str)
{
    var lastIndex = this.lastIndexOf(str);
    return (lastIndex !== -1) && (lastIndex + str.length === this.length);
}

यदि आपके लिए प्रदर्शन महत्वपूर्ण है, तो यह परीक्षण के लायक होगा या नहीं lastIndexOf वास्तव में एक सबस्ट्रिंग बनाने से नहीं है या नहीं। (यह आपके द्वारा उपयोग किए जा रहे जेएस इंजन पर निर्भर हो सकता है ...) यह मिलान करने वाले मामले में तेज़ी से हो सकता है, और जब स्ट्रिंग छोटा होता है - लेकिन जब स्ट्रिंग बहुत बड़ी होती है तो उसे पूरी चीज़ को वापस देखने की आवश्यकता होती है हालांकि हम वास्तव में परवाह नहीं करते हैं :(

एक वर्ण की जांच करने के लिए, लंबाई ढूंढना और फिर उपयोग करना charAt शायद सबसे अच्छा तरीका है।


55
2017-11-11 11:58



यदि यह .lastIndexOf () 1 देता है, तो आप उन मामलों को हिट कर सकते हैं जहां यह वास्तविक पर निर्भर करता है। लम्बाई और str.length। एक परीक्षण जोड़ें जो lastIndexOf ()! = -1। - ebruchez
अच्छा पकड़, धन्यवाद। - Jon Skeet
रेगेक्स विधि क्यों टूटी हुई है? - izb
@izb: उत्तर जो मेरे से बड़े हैं जो उपयोग करने का प्रयास करते हैं str+"$" चूंकि एक रेगेक्स टूटा हुआ है, क्योंकि वे वैध regexes नहीं हो सकता है। - Jon Skeet


के साथ संपर्क नहीं देखा था slice तरीका। तो मैं इसे यहाँ छोड़ दूंगा:

function endsWith(str, suffix) {
    return str.slice(-suffix.length) === suffix
}

23
2018-06-09 07:17



आप इसे थोड़ा और सरल बना सकते हैं: वापस str.slice (-1) === प्रत्यय; - Erik K.
यह सबसे अच्छा जवाब है। निश्चित नहीं है कि इसमें अधिक अपवर्तक क्यों नहीं हैं। - Jason Tu


return this.lastIndexOf(str) + str.length == this.length;

उस मामले में काम नहीं करता है जहां मूल स्ट्रिंग लंबाई खोज स्ट्रिंग लंबाई से कम है और खोज स्ट्रिंग नहीं मिली है:

lastIndex वापसी 1 के बाद, आप खोज स्ट्रिंग लंबाई जोड़ते हैं और आपको मूल स्ट्रिंग की लंबाई के साथ छोड़ दिया जाता है।

एक संभावित फिक्स है

return this.length >= str.length && this.lastIndexOf(str) + str.length == this.length

17
2018-03-04 15:58



आपने "जॉन स्कीट उत्तर में एक गलती पाई" बैज अर्जित किया है। विवरण के लिए अपनी प्रोफ़ाइल देखें। - bobince


Developer.mozilla.org से String.prototype.endsWith ()

सारांश

endsWith() विधि निर्धारित करती है कि कोई स्ट्रिंग किसी अन्य स्ट्रिंग के वर्णों के साथ समाप्त होती है, जो सही या गलत के रूप में लौटती है।

वाक्य - विन्यास

str.endsWith(searchString [, position]);

पैरामीटर

  • खोज स्ट्रिंग : इस स्ट्रिंग के अंत में वर्णों की खोज की जाएगी।

  • पद : इस स्ट्रिंग के भीतर खोजें जैसे कि यह स्ट्रिंग केवल इतना लंबा था; इस स्ट्रिंग की लंबाई तक स्थापित सीमा के भीतर क्लैंप किए गए इस स्ट्रिंग की वास्तविक लंबाई के लिए डिफ़ॉल्ट।

विवरण

यह विधि आपको यह निर्धारित करने देती है कि स्ट्रिंग किसी अन्य स्ट्रिंग के साथ समाप्त होती है या नहीं।

उदाहरण

var str = "To be, or not to be, that is the question.";

alert( str.endsWith("question.") );  // true
alert( str.endsWith("to be") );      // false
alert( str.endsWith("to be", 19) );  // true

विशेष विवरण

ईसीएमएस्क्रिप्ट भाषा विशिष्टता 6 वां संस्करण (ईसीएमए -262)

ब्राउज़र संगतता

Browser compatibility


13
2018-03-05 14:57





String.prototype.endsWith = function(str) 
{return (this.match(str+"$")==str)}

String.prototype.startsWith = function(str) 
{return (this.match("^"+str)==str)}

आशा है कि ये आपकी मदद करेगा

var myStr = “  Earth is a beautiful planet  ”;
var myStr2 = myStr.trim();  
//==“Earth is a beautiful planet”;

if (myStr2.startsWith(“Earth”)) // returns TRUE

if (myStr2.endsWith(“planet”)) // returns TRUE

if (myStr.startsWith(“Earth”)) 
// returns FALSE due to the leading spaces…

if (myStr.endsWith(“planet”)) 
// returns FALSE due to trailing spaces…

पारंपरिक तरीका

function strStartsWith(str, prefix) {
    return str.indexOf(prefix) === 0;
}

function strEndsWith(str, suffix) {
    return str.match(suffix+"$")==suffix;
}

8
2017-10-17 10:55



रेगेक्स एस्केप दृश्यों के लिए आपको अपनी स्ट्रिंग से बचना होगा - Juan Mendes
तेजी से भाषाओं में भी नियमित अभिव्यक्ति धीमी होती है। बस एक स्ट्रिंग के अंत की जांच करें। - Daniel Nuriyev


if( ("mystring#").substr(-1,1) == '#' )

- या -

if( ("mystring#").match(/#$/) )

7
2017-11-11 11:26





मैं तुम्हारे बारे में नहीं जानता, लेकिन:

var s = "mystring#";
s.length >= 1 && s[s.length - 1] == '#'; // will do the thing!

नियमित अभिव्यक्ति क्यों? प्रोटोटाइप के साथ गड़बड़ क्यों? substr? चलो ...


7
2018-05-02 08:01



'कभी-कभी यह बेहतर होता है जब यह डब्लू.ई.टी. - Martin Capodici