স্ট্রিং "স্টার্টসইথ" এর সাথে অন্য স্ট্রিং রয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


1690

আমি String.StartsWithজাভাস্ক্রিপ্টে সি # এর সমতুল্য কীভাবে লিখব ?

var haystack = 'hello world';
var needle = 'he';

haystack.startsWith(needle) == true

দ্রষ্টব্য: এটি একটি পুরানো প্রশ্ন, এবং মন্তব্যগুলিতে ইক্যমাস্ক্রিপ্ট 2015 (ইএস 6) .startsWithপদ্ধতিটির সূচনা হিসাবে উল্লেখ করা হয়েছে । যাইহোক, এই আপডেটটি লেখার সময় (2015) ব্রাউজার সমর্থন সম্পূর্ণ থেকে দূরে

উত্তর:


1773

আপনি ECMAScript 6 এর String.prototype.startsWith()পদ্ধতিটি ব্যবহার করতে পারেন তবে এটি এখনও সমস্ত ব্রাউজারে সমর্থিত নয় । আপনি এটি সমর্থন করে না এমন ব্রাউজারগুলিতে শিম / পলফিল ব্যবহার করতে চাইবেন। বিশেষায় বর্ণিত সমস্ত বিবরণ মেনে এমন একটি বাস্তবায়ন তৈরি করা কিছুটা জটিল। আপনি যদি বিশ্বস্ত শিম চান, তবে ব্যবহার করুন:

একবার আপনি পদ্ধতিটি ঝিমঝিম করে ফেলেছেন (বা যদি আপনি কেবল ব্রাউজারগুলি এবং ইতিমধ্যে এটি থাকা জাভাস্ক্রিপ্ট ইঞ্জিনগুলি সমর্থন করেন), আপনি এটি ব্যবহার করতে পারেন:

"Hello World!".startsWith("He"); // true

var haystack = "Hello world";
var prefix = 'orl';
haystack.startsWith(prefix); // false

@gtourie কেন স্ট্রিং দিয়ে স্ট্রিং শুরু হয় তা পরীক্ষা করার সবচেয়ে খারাপ পদ্ধতিগুলির মধ্যে কেন? (আপনার মন্তব্য এখানে দেখুন: stackoverflow.com/questions/646628/… ) আপনি প্রতিটি চরিত্রের সাথে চরিত্রের তুলনা করতে আরও উত্সাহী। আমি আশা করি যে সংকলকগুলি প্রতিটি স্ট্রিংয়ের জন্য একটি স্ট্রিং তৈরি করতে যথেষ্ট পর্যাপ্ত নয় [সূচক] কারণ, আপনি যদি সহজভাবে এটি লিখেন: অক্ষর = স্ট্রিং [0] এটি কোনও বস্তু বরাদ্দ করবে, সূচনা ব্যবহারের চেয়ে অসীমভাবে কম দক্ষ (প্রারম্ভের সাথে কোনও স্মৃতি বরাদ্দ করবে না) )
মার্টিজন শেফার

@ মার্তিজ্নশেফার: উত্তরটি আমি সম্পাদনার পরে অনেক বার সম্পাদনা করা হয়েছে এবং এখন সম্পূর্ণ আলাদা (আমি আমার মন্তব্য সরিয়ে দিয়েছি;)। আমি সম্মত হই যে ECMAScript 6 এর প্রারম্ভকালীন পদ্ধতিটি এটি করার সর্বোত্তম উপায়।
gtourie

6
@ গ্রাহামলাইট, যখন আপনি 'আইই' দ্বারা সমর্থিত বলবেন, সম্ভবত আপনি এজ দ্বারা বোঝাচ্ছেন। বিকাশকারী.মোজিলা.আর.ইন
মার্কাস

@ মার্কাস, আমি ভুল হলে ক্ষমা চেয়েছি - আমার তথ্য এসেছে: w3schools.com/jsref/jsref_startswith.asp
গ্রাহাম লাইট

সতর্কবার্তা! এই jsperf পরীক্ষাগুলি JIT সংকলনে ভাল ব্রাউজারগুলিতে কাজ করে না। ফায়ারফক্স এবং ক্রোমের মতো ব্রাউজারগুলি কখনও কখনও কোনও অপারেশনের ফলাফল বাতিল হয়ে গেলে এটি সনাক্ত করে এবং তাই অপারেশনটি সম্পাদন করে না । এগুলি ছাড়াও আধুনিক জাভাস্ক্রিপ্ট ইঞ্জিনগুলি শাখার পূর্বাভাস ব্যবহার করে , সুতরাং পরীক্ষার স্ট্রিংগুলি প্রতিটি পুনরাবৃত্তির ক্ষেত্রে পৃথক হওয়া উচিত।
আলসো

1282

এর সাথে আরও একটি বিকল্প .lastIndexOf:

haystack.lastIndexOf(needle, 0) === 0

এটি এখন করা পিছন দেখায় haystackএকজন সংঘটন জন্য needleসূচক থেকে শুরু 0এর haystack। অন্য কথায়, এটি haystackশুরু হলে কেবল এটি পরীক্ষা করে needle

নীতিগতভাবে, এর অন্যান্য কয়েকটি পদ্ধতির তুলনায় পারফরম্যান্স সুবিধা থাকতে হবে:

  • এটি সম্পূর্ণ অনুসন্ধান করে না haystack
  • এটি কোনও নতুন অস্থায়ী স্ট্রিং তৈরি করে না এবং তাৎক্ষণিকভাবে এটিকে বাতিল করে দেয়।

1
@ Rfcoder89 কোন মামলাটি নিচ্ছে তা নিশ্চিত নয় - jsfiddle.net/jkzjw3w2/1
গিল্ফারাজ রহমান

5
@ আরএফকোডার 89 লাস্ট ইনডেক্সের দ্বিতীয় প্যারামিটারটি লক্ষ্য করুন: "aba".lastIndexOf ("a")আপনি দেখানোর মতো 2, তবে "aba".lastIndexOf ("a", 0)0, যা সঠিক
ম্যাক্সপলক

1
তোমাকে অনেক ধন্যবাদ. স্ট্রিং.স্টার্টস অ্যান্ড্রয়েড ললিপপ ওয়েবভিউতে কাজ করে না, তবে এই সর্বশেষ তালিকাটি স্নিপেটে করে !!!
হারমান

সঙ্গে lastIndexOf স্ট্রিং শুরুতে তাই এটি পুরো স্ট্রিং অনুসন্ধানে শেষ থেকে অনুসন্ধান করা হয়: তাই তার অযোগ্যতা খুব দীর্ঘ স্ট্রিং জন্য বৃদ্ধি অনুসন্ধানটি করতে হবে।
wonka লাগুক

8
@ উইলিওনকা না, এটি যদি আপনার 0 স্টার্ট ইন্ডেক্স থাকে না তবে এটি 0 টি পোস্ট থেকে অনুসন্ধান করা হয় এবং এটি কেবলমাত্র চেক। পুরো স্ট্রিংটি কেবলমাত্র ইনডেক্স> = স্ট্রিং লেন্থ থেকে অনুসন্ধান করা হয়।
গ্রীন

588
data.substring(0, input.length) === input

3
@ আমার মনে হয় এটিকে ব্রাউজার এবং ব্যবহৃত ডেটার উপর দৃ on়ভাবে নির্ভর করে। আসল পরিমাপের জন্য বেন ওয়েভারের উত্তর দেখুন। ব্রাউজারে আমি বর্তমানে চলছি (উইন্ডোজে ক্রোম 12.0.742) সাবস্ট্রিং সাফল্যের জন্য জয়যুক্ত এবং ব্যর্থতার জন্য প্রস্তুত রেইগেক্স জিতেছে।
কোব্বল

4
@ কোবল সম্ভবত তবে .lastIndexOf(input, 0)প্রথম এন অক্ষরের সাথে তুলনা করা হয়, যেখানে .substring(0, input.length) === inputএন গণনা করা হয়, ডেটা এন দৈর্ঘ্যে সাবস্ট্রিং করে এবং তারপরে সেই এন অক্ষরের সাথে তুলনা করা হয়। কোড অপ্টিমাইজেশন না থাকলে এই দ্বিতীয় সংস্করণটি অন্যটির চেয়ে দ্রুততর হতে পারে না। যদিও আমাকে ভুল করবেন না, আমি নিজের প্রস্তাব মতো আর কখনও ভাল কিছু পাই না। :)
ANeves

2
@ এ্যানভেস্টস কিন্তু .স্লাস্ট ইন্ডেক্সের পরে লম্বা স্ট্রিংয়ের ক্ষেত্রে যেটি মিথ্যা ফিরতে চলেছে তা পুরো স্ট্রিং (ও (এন)) এর উপর পুনরাবৃত্তি হতে চলেছে, যেখানে সাবস্ক্রিংয়ের ক্ষেত্রে সম্ভাব্য অনেক ছোট স্ট্রিংটি পুনরাবৃত্তি হয়। যদি আপনি সংখ্যাগরিষ্ঠ সাফল্য বা কেবলমাত্র ছোট ইনপুটগুলি আশা করেন তবে .lastIndexOf সম্ভবত দ্রুত - অন্যথায়। সাবস্ট্রিং সম্ভবত দ্রুততর হয়। ইনপুটটি যদি স্ট্রিংয়ের চেয়ে বেশি দীর্ঘ হয় তবে সাবস্ক্রিংয়েরও ব্যতিক্রম ঝুঁকি থাকে।
ক্রিস মোসচিনি 22'13 এ 20

14
@ ক্রিসমোসিনি, ভুলে যাবেন না যে মার্ক বাইয়ার্সের সমাধানটি lastIndexOfসূচি 0 তে শুরু হয়েছে, শেষ নয়। এটি আমাকে প্রথম দিকেও ছড়িয়ে দিয়েছে। তবুও, স্ট্রিংটি কী দিয়ে শুরু হয় তা যাচাই করা এমন একটি সাধারণ কাজ যা জাভাস্ক্রিপ্টের পক্ষে এটির জন্য যথাযথ এপিআই থাকা উচিত, এই পৃষ্ঠায় আপনি যে সমস্ত প্রতিমা এবং বিকল্পগুলি দেখেন তা নয়, তারা চতুর।
রেন্ডাল কুক

4
আমি কোক্বালের সমাধানটিকে মার্কের চেয়ে বেশি পছন্দ করি। এমনকি চিহ্নগুলি দ্রুত এবং প্যারামগুলি ব্যবহার করে একটি চিত্তাকর্ষক কৌশল হলেও স্ট্রিংয়ের তুলনায় এটি পড়া খুব কঠিন very
থিঙ্কবোনো

183

কোনও সাহায্যকারী ফাংশন ছাড়াই, কেবলমাত্র রেইগেক্সের .testপদ্ধতিটি ব্যবহার করে :

/^He/.test('Hello world')

একটি হার্ডকোডযুক্ত না হয়ে গতিশীল স্ট্রিং দিয়ে এটি করার জন্য (ধরে নিই যে স্ট্রিংটিতে কোনও রেজিপ্যাক্স নিয়ন্ত্রণের অক্ষর থাকবে না):

new RegExp('^' + needle).test(haystack)

আপনার জাভাস্ক্রিপ্টে কোনও RegExp.escape ফাংশন আছে কিনা তা পরীক্ষা করে দেখা উচিত ? যদি সম্ভাবনাটি বিদ্যমান থাকে তবে রেজিপ্সপ নিয়ন্ত্রণের অক্ষরগুলি স্ট্রিংয়ে উপস্থিত হয়।


1
অভিব্যক্তি কেস-সংবেদনশীল ব্যবহারের জন্য/^he/i
kaizer1v

64

সবচেয়ে ভালো সমাধান:

function startsWith(str, word) {
    return str.lastIndexOf(word, 0) === 0;
}

এবং এখানেই শেষ রয়েছে আপনার যদি এটিরও প্রয়োজন হয়:

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

যারা স্ট্রিংয়ে এটি প্রোটোটাইপ করতে পছন্দ করেন তাদের জন্য:

String.prototype.startsWith || (String.prototype.startsWith = function(word) {
    return this.lastIndexOf(word, 0) === 0;
});

String.prototype.endsWith   || (String.prototype.endsWith = function(word) {
    return this.indexOf(word, this.length - word.length) !== -1;
});

ব্যবহার:

"abc".startsWith("ab")
true
"c".ensdWith("c") 
true

পদ্ধতি সহ:

startsWith("aaa", "a")
true
startsWith("aaa", "ab")
false
startsWith("abc", "abc")
true
startsWith("abc", "c")
false
startsWith("abc", "a")
true
startsWith("abc", "ba")
false
startsWith("abc", "ab")
true

আমি মনে করি আপনি আপনার ফাংশনগুলিতে সর্বশেষ সূচিপত্র এবং সূচিপত্রের মিশ্রণ করেছেন - প্রারম্ভের সাথে str.indexOf (শব্দ, 0) === 0 প্রদান করা উচিত;
রিচার্ড ম্যাথসন

5
@ রিচার্ড ম্যাথসন ইনডেক্সফ ব্যবহার করে সমস্যাটি হ'ল এটি যদি শুরুতে মিলতে ব্যর্থ হয় তবে এটি পুরো স্ট্রিংটি অনুসন্ধান চালিয়ে যাবে, যার মাধ্যমে লাস্ট ইন্ডেক্সঅফ শব্দের দৈর্ঘ্য থেকে শুরু হয়ে শূন্যে ফিরে যাবে। বুঝেছি?
মিমি

2
আহ্ হ্যাঁ এখনই বোঝায় - আপনি যে সূচকগুলি ব্যবহার করছিলেন সেগুলিতে আমি মনোযোগ দিই নি। খুব সুন্দর কৌশল!
রিচার্ড ম্যাথসন

54

আমি এই সম্পর্কে আমার মতামত যোগ করতে চেয়েছিলেন।

আমি মনে করি আমরা কেবল এটির মতো ব্যবহার করতে পারি:

var haystack = 'hello world';
var needle = 'he';

if (haystack.indexOf(needle) == 0) {
  // Code if string starts with this substring
}

2
মার্ক বাইয়ারের উত্তরটিকে @relfor দ্বারা তিনটি ভিন্ন সঠিক পদ্ধতির পারফরম্যান্সের জন্য তুলনা করা হয়েছিল। এই সঠিক পদ্ধতির পক্ষে নেওয়া হয়নি কারণ এর জন্য পুরো স্ট্রিংটি অনুসন্ধান করা দরকার।
ম্যাক্সপলক

@ ম্যাক্স্পলোক আমার মনে হয় indexOfযখন প্রথম ঘটনাটি পাওয়া যাবে তখন পুরো স্ট্রিং অনুসন্ধান বন্ধ করবে। আমি এটি চেক করেছি।
মিঃডি

8
প্রথম ঘটনাটি যদি প্রথম দিকে না পাওয়া যায়, তবে এই পদ্ধতির অদক্ষতা বৃদ্ধি পেতে শুরু করে যতক্ষণ এটি তার সন্ধান করা চালিয়ে যায়, সম্ভাব্যত খুব বেশি আগে হাল ছেড়ে দেওয়ার পরিবর্তে একেবারে শেষ অবধি পৌঁছা পর্যন্ত অনুসন্ধান করে। অদক্ষতার সম্ভাবনা রয়েছে বলে তিনটি সঠিক পদ্ধতির মধ্যে এটি অনুকূল নয়।
ম্যাক্সপলক

2
@ মিঃ ডি এবং যদি কোন মিল নেই?
মিমি

নাহলে খড়ের সব সন্ধান করা হয়েছে কখন? ভাল: স্ট্যাকওভারফ্লো . com / a / 36876507 / 961018 .. কেবলমাত্র শব্দের দৈর্ঘ্য পর্যন্ত অনুসন্ধান করে
মিমি

39

সিএমএসের সমাধানে এখানে একটি ছোট্ট উন্নতি রয়েছে:

if(!String.prototype.startsWith){
    String.prototype.startsWith = function (str) {
        return !this.indexOf(str);
    }
}

"Hello World!".startsWith("He"); // true

 var data = "Hello world";
 var input = 'He';
 data.startsWith(input); // true

কোনও ভবিষ্যত ব্রাউজার যদি স্থানীয় কোডে প্রয়োগ করে বা অন্য লাইব্রেরি দ্বারা প্রয়োগ করা হয় তবে ফাংশনটি ইতিমধ্যে বিদ্যমান কিনা তা পরীক্ষা করা হচ্ছে। উদাহরণস্বরূপ, প্রোটোটাইপ লাইব্রেরি এই ফাংশনটি ইতিমধ্যে প্রয়োগ করে।

ব্যবহার !সামান্য দ্রুততর এবং তুলনায় আরো সংক্ষিপ্ত হয় === 0যদিও পাঠযোগ্য হিসেবে নয়।


1
এটি একটি সমস্যা হয়ে উঠতে পারে: ইতিমধ্যে কার্যকরভাবে প্রয়োগ করা যদি আমার নিজের থেকে আলাদা আচরণ করে তবে এটি আমার আবেদনটি ভেঙে দেবে।
ক্রিস্টোফ উর্ম

2
এই হে (ঢ) সমস্যা এখানে আলোচনা হয়েছে stackoverflow.com/questions/646628/javascript-startswith/...
ক্রিস Moschini

1
ব্যবহার ! খুব অগোছালো আছে
JonnyRaa

-1; এই যোগ করার String.prototypeএকটি খারাপ ধারণা কারণ এটি যে কোন জায়গায় মেনে চলার পাসে আসে না বৈশিষ্ট জন্য String.prototype.startsWith। ES6 পদ্ধতিটি ব্যবহার করার চেষ্টা করে এমন কোনও কোড যদি আপনি এটি করে থাকেন তবে ব্যর্থ হতে পারে; পদ্ধতিটি ইতিমধ্যে সংজ্ঞায়িত হয়েছে কিনা তা দেখতে ভাল হতে পারে, দেখুন যে এটি (খারাপভাবে, আপনার দ্বারা) এবং কোনও অনুমান-অনুবর্তী শিমটি যুক্ত না করে পরে ভুল আচরণের দিকে পরিচালিত করে।
মার্ক অ্যামেরি

21

এছাড়াও চেক আউট underscore.string.js । এটি একটি startsWithপদ্ধতি সহ কার্যকর স্ট্রিং টেস্টিং এবং ম্যানিপুলেশন পদ্ধতিগুলির একটি গোছা নিয়ে আসে । ডক্স থেকে:

সঙ্গে সঙ্গে শুরু হয় _.startsWith(string, starts)

এই পদ্ধতিটি stringদিয়ে শুরু হয় কিনা তা পরীক্ষা করে starts

_("image.gif").startsWith("image")
=> true

1
আমার দরকার_.string.startsWith
কর্নেল প্যানিক

15

আমি সম্প্রতি নিজেকে একই প্রশ্ন জিজ্ঞাসা করেছি।
একাধিক সম্ভাব্য সমাধান রয়েছে, এখানে 3 টি বৈধ রয়েছে:

  • s.indexOf(starter) === 0
  • s.substr(0,starter.length) === starter
  • s.lastIndexOf(starter, 0) === 0(মার্ক বাইয়ার্সের উত্তর দেখার পরে যুক্ত করা হয়েছে )
  • একটি লুপ ব্যবহার:

    function startsWith(s,starter) {
      for (var i = 0,cur_c; i < starter.length; i++) {
        cur_c = starter[i];
        if (s[i] !== starter[i]) {
          return false;
        }
      }
      return true;
    }

আমি শেষ সমাধানটি পাইনি যা লুপ ব্যবহার করে।
আশ্চর্যজনকভাবে এই সমাধানটি প্রথম 3টিকে উল্লেখযোগ্য ব্যবধানে ছাড়িয়ে যায়।
এই উপসংহারে পৌঁছানোর জন্য আমি সম্পাদিত jsperf পরীক্ষাটি এখানে: http://jsperf.com/startswith2/2

শান্তি

PS: বাস্তু স্ক্রিপ্ট 6 (সম্প্রীতি) startsWithস্ট্রিংগুলির জন্য একটি স্থানীয় পদ্ধতি প্রবর্তন করে।
কেবলমাত্র চিন্তা করুন যে তারা যদি প্রাথমিক সংস্করণে এই প্রয়োজনীয় পদ্ধতিটি অন্তর্ভুক্ত করার কথা চিন্তা করে থাকে তবে কত সময় বেঁচে যেত।

হালনাগাদ

স্টিভ যেমন উল্লেখ করেছেন (এই উত্তরের প্রথম মন্তব্য), উপরের কাস্টম ফাংশনটি একটি ত্রুটি ফেলবে যদি প্রদত্ত উপসর্গটি পুরো স্ট্রিংয়ের চেয়ে কম হয়। তিনি এটি স্থির করেছেন এবং একটি লুপ অপ্টিমাইজেশন যুক্ত করেছেন যা http://jsperf.com/startswith2/4 এ দেখা যাবে ।

মনে রাখবেন যে দুটি লুপ অপ্টিমাইজেশন রয়েছে যা স্টিভ অন্তর্ভুক্ত করেছে, দুজনের মধ্যে প্রথমটি আরও ভাল পারফরম্যান্স দেখিয়েছে, সুতরাং আমি নীচে কোডটি পোস্ট করব:

function startsWith2(str, prefix) {
  if (str.length < prefix.length)
    return false;
  for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i)
    continue;
  return i < 0;
}

সর্বশেষ রেভ দেখুন। উপরের সংস্করণে বাগটি ছাড়াও (স্ট্রিংটি উপসর্গের চেয়ে কম হলে এটি নিক্ষেপ করবে), এটি আরও অনুকূলিত সংস্করণটির চেয়েও ধীর। দেখুন jsperf.com/startswith2/4 এবং jsperf.com/js-startswith/35
স্টিভ হোল্যাশ

F

jsperf.com/startswith2/29 => startWith5 সংক্ষিপ্ত এবং সত্যই ভাল পারফরম্যান্স =)
gtourie

11

যেহেতু এটি এত জনপ্রিয় তাই আমি মনে করি যে এটি ECMA 6 এ এই পদ্ধতির বাস্তবায়ন রয়েছে এবং এটির প্রস্তুতির জন্য ভবিষ্যতের সমস্যা ও অশ্রু রোধে 'অফিসিয়াল' পলিফিল ব্যবহার করা উচিত।

ভাগ্যক্রমে মজিলার বিশেষজ্ঞরা আমাদের একটি সরবরাহ করেন:

https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/String/startsWith

if (!String.prototype.startsWith) {
    String.prototype.startsWith = function(searchString, position) {
        position = position || 0;
        return this.indexOf(searchString, position) === position;
    };
}

দয়া করে মনে রাখবেন যে ইসিএমএ 6 এ রূপান্তর করার সময় এটিকে করুণভাবে উপেক্ষা করার সুবিধা রয়েছে।


5

সর্বাধিক পারফরম্যান্ট সমাধান হ'ল লাইব্রেরি কলগুলি ব্যবহার বন্ধ করা এবং আপনি দুটি অ্যারে নিয়ে কাজ করছেন তা কেবল স্বীকৃতি। একটি হ্যান্ড রোলড বাস্তবায়ন উভয়ই সংক্ষিপ্ত এবং এটি আমি এখানে দেখেছি এমন প্রতিটি সমাধানের চেয়ে দ্রুত।

function startsWith2(str, prefix) {
    if (str.length < prefix.length)
        return false;
    for (var i = prefix.length - 1; (i >= 0) && (str[i] === prefix[i]); --i)
        continue;
    return i < 0;
}

পারফরম্যান্স তুলনা (সাফল্য এবং ব্যর্থতা) জন্য, দেখুন http://jsperf.com/startswith2/4 । (নিশ্চিত হয়ে নিন যে আপনি পরবর্তী সংস্করণগুলি যাচাই করে ফেলেছেন যা আমারকে ট্রম্প করেছে have)


2

আমি কেবল এই স্ট্রিং লাইব্রেরি সম্পর্কে জানতে পারি:

http://stringjs.com/

জেএস ফাইল অন্তর্ভুক্ত করুন এবং তার পরে Sভেরিয়েবলটি ব্যবহার করুন :

S('hi there').endsWith('hi there')

এটি ইনস্টল করে নোডজেএসেও ব্যবহার করা যেতে পারে:

npm install string

তারপরে এটি Sপরিবর্তনশীল হিসাবে প্রয়োজনীয় :

var S = require('string');

ওয়েব পৃষ্ঠাতে বিকল্প স্ট্রিং গ্রন্থাগারগুলির লিঙ্কগুলিও রয়েছে, যদি এটি কোনও আপনার অভিনব ব্যবহার না করে।


2
  1. প্রশ্নটি কিছুটা পুরানো, তবে আমি এখানে জবাব বাকের ভাগ করা সমস্ত উত্তর এবং জেএসপিআরফের উপর ভিত্তি করে তৈরি কিছু মানদণ্ড আপনাকে দেখানোর জন্য এই উত্তরটি লিখতে চেয়েছিলাম।

আমার প্রাথমিকভাবে এটি খুঁজে পেতে একটি দ্রুত উপায়ের প্রয়োজন ছিল যে দীর্ঘ খড়ের মধ্যে একটি দীর্ঘ সূচ রয়েছে এবং শেষ অক্ষরগুলি ব্যতীত সেগুলি খুব অনুরূপ।

আমি যে কোডটি লিখেছি তা এখানে যা প্রতিটি ফাংশনের জন্য (স্প্লাইস, সাবস্ট্রিং, স্টার্টসইথ, ইত্যাদি) উভয়ই পরীক্ষা করে যখন তারা nestedString1.000.0001 অক্ষরের খড়ের স্ট্রিং ( ) এর বিরুদ্ধে মিথ্যা এবং সত্য ফিরে আসে এবং 1.000.000 এর মিথ্যা বা সত্যবাদী সূঁচের স্ট্রিং চরগুলি ( testParentStringFalseএবং testParentStringTrueযথাক্রমে):

// nestedString is made of 1.000.001 '1' repeated characters.
var nestedString = '...'

// testParentStringFalse is made of 1.000.000 characters,
// all characters are repeated '1', but the last one is '2',
// so for this string the test should return false.
var testParentStringFalse = '...'

// testParentStringTrue is made of 1.000.000 '1' repeated characters,
// so for this string the test should return true.
var testParentStringTrue = '...'

// You can make these very long strings by running the following bash command
// and edit each one as needed in your editor
// (NOTE: on OS X, `pbcopy` copies the string to the clipboard buffer,
//        on Linux, you would probably need to replace it with `xclip`):
// 
//     printf '1%.0s' {1..1000000} | pbcopy
// 

function testString() {
    let dateStart
    let dateEnd
    let avg
    let count = 100000
    const falseResults = []
    const trueResults = []

    /* slice */
    console.log('========> slice')
    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.slice(0, testParentStringFalse.length) === testParentStringFalse
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    falseResults[falseResults.length] = {
        label: 'slice',
        avg
    }
    console.log(`testString() slice = false`, res, 'avg: ' + avg + 'ms')

    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.slice(0, testParentStringTrue.length) === testParentStringTrue
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    trueResults[trueResults.length] = {
        label: 'slice',
        avg
    }
    console.log(`testString() slice = true`, res, 'avg: ' + avg + 'ms')
    console.log('<======== slice')
    console.log('')
    /* slice END */

    /* lastIndexOf */
    console.log('========> lastIndexOf')
    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.lastIndexOf(testParentStringFalse, 0) === 0
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    falseResults[falseResults.length] = {
        label: 'lastIndexOf',
        avg
    }
    console.log(`testString() lastIndexOf = false`, res, 'avg: ' + avg + 'ms')

    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.lastIndexOf(testParentStringTrue, 0) === 0
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    trueResults[trueResults.length] = {
        label: 'lastIndexOf',
        avg
    }
    console.log(`testString() lastIndexOf = true`, res, 'avg: ' + avg + 'ms')
    console.log('<======== lastIndexOf')
    console.log('')
    /* lastIndexOf END */

    /* indexOf */
    console.log('========> indexOf')
    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.indexOf(testParentStringFalse) === 0
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    falseResults[falseResults.length] = {
        label: 'indexOf',
        avg
    }
    console.log(`testString() indexOf = false`, res, 'avg: ' + avg + 'ms')

    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.indexOf(testParentStringTrue) === 0
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    trueResults[trueResults.length] = {
        label: 'indexOf',
        avg
    }
    console.log(`testString() indexOf = true`, res, 'avg: ' + avg + 'ms')
    console.log('<======== indexOf')
    console.log('')
    /* indexOf END */

    /* substring */
    console.log('========> substring')
    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.substring(0, testParentStringFalse.length) === testParentStringFalse
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    falseResults[falseResults.length] = {
        label: 'substring',
        avg
    }
    console.log(`testString() substring = false`, res, 'avg: ' + avg + 'ms')

    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.substring(0, testParentStringTrue.length) === testParentStringTrue
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    trueResults[trueResults.length] = {
        label: 'substring',
        avg
    }
    console.log(`testString() substring = true`, res, 'avg: ' + avg + 'ms')
    console.log('<======== substring')
    console.log('')
    /* substring END */

    /* startsWith */
    console.log('========> startsWith')
    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.startsWith(testParentStringFalse)
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    falseResults[falseResults.length] = {
        label: 'startsWith',
        avg
    }
    console.log(`testString() startsWith = false`, res, 'avg: ' + avg + 'ms')

    dateStart = +new Date()
    var res
    for (let j = 0; j < count; j++) {
        res = nestedString.startsWith(testParentStringTrue)
    }
    dateEnd = +new Date()
    avg = (dateEnd - dateStart)/count
    trueResults[trueResults.length] = {
        label: 'startsWith',
        avg
    }
    console.log(`testString() startsWith = true`, res, 'avg: ' + avg + 'ms')
    console.log('<======== startsWith')
    console.log('')
    /* startsWith END */

    falseResults.sort((a, b) => a.avg - b.avg)
    trueResults.sort((a, b) => a.avg - b.avg)

    console.log('false results from fastest to slowest avg:', falseResults)
    console.log('true results from fastest to slowest avg:', trueResults)
}

আমি ক্রোম 75 , ফায়ারফক্স 67 , সাফারি 12 এবং অপেরা 62 এ এই বেনমার্ক পরীক্ষাটি চালিয়েছি ।

আমি এজ এবং আইয়িকে অন্তর্ভুক্ত করি নি কারণ এই মেশিনে আমার সেগুলি নেই তবে আপনি যদি কেউ এজ এর বিপরীতে স্ক্রিপ্টটি চালাতে চান এবং কমপক্ষে IE 9 এবং ফলাফলটি এখানে ভাগ করতে চান তবে আমি ফলাফলগুলি দেখতে খুব আগ্রহী হব would

কেবল মনে রাখবেন যে আপনাকে 3 টি দীর্ঘ স্ট্রিং পুনরায় তৈরি করতে হবে এবং স্ক্রিপ্টটি কোনও ফাইলে সংরক্ষণ করতে হবে যা আপনি ব্রাউজারের কনসোলে অনুলিপি / পেস্ট হিসাবে খুললে ব্রাউজারের কনসোলে এটি আটকাবে কারণ প্রতিটি স্ট্রিংয়ের দৈর্ঘ্য> = 1.000.000))

ফলাফলগুলি এখানে:

ক্রোম 75 ( substringজয়):

false results from fastest to slowest avg:
1)  {"label":"substring","avg":0.08271}
2)  {"label":"slice","avg":0.08615}
3)  {"label":"lastIndexOf","avg":0.77025}
4)  {"label":"indexOf","avg":1.64375}
5)  {"label":"startsWith","avg":3.5454}

true results from fastest to slowest avg:
1)  {"label":"substring","avg":0.08213}
2)  {"label":"slice","avg":0.08342}
3)  {"label":"lastIndexOf","avg":0.7831}
4)  {"label":"indexOf","avg":0.88988}
5)  {"label":"startsWith","avg":3.55448}

ফায়ারফক্স 67 ( indexOfজয়):

false results from fastest to slowest avg
1)  {"label":"indexOf","avg":0.1807}
2)  {"label":"startsWith","avg":0.74621}
3)  {"label":"substring","avg":0.74898}
4)  {"label":"slice","avg":0.78584}
5)  {"label":"lastIndexOf","avg":0.79668}

true results from fastest to slowest avg:
1)  {"label":"indexOf","avg":0.09528}
2)  {"label":"substring","avg":0.75468}
3)  {"label":"startsWith","avg":0.76717}
4)  {"label":"slice","avg":0.77222}
5)  {"label":"lastIndexOf","avg":0.80527}

সাফারি 12 ( sliceমিথ্যা ফলাফলের startsWithজন্য বিজয়ী , সত্য ফলাফলের জন্য জয়ী, এছাড়াও পুরো পরীক্ষার সম্পাদন করার জন্য সাফারি মোট সময়ের দিক থেকে দ্রুততম):

false results from fastest to slowest avg:
1) "{\"label\":\"slice\",\"avg\":0.0362}"
2) "{\"label\":\"startsWith\",\"avg\":0.1141}"
3) "{\"label\":\"lastIndexOf\",\"avg\":0.11512}"
4) "{\"label\":\"substring\",\"avg\":0.14751}"
5) "{\"label\":\"indexOf\",\"avg\":0.23109}"

true results from fastest to slowest avg:
1) "{\"label\":\"startsWith\",\"avg\":0.11207}"
2) "{\"label\":\"lastIndexOf\",\"avg\":0.12196}"
3) "{\"label\":\"substring\",\"avg\":0.12495}"
4) "{\"label\":\"indexOf\",\"avg\":0.33667}"
5) "{\"label\":\"slice\",\"avg\":0.49923}"

অপেরা 62 ( substringবিজয়ী Results ফলাফলগুলি ক্রোমের সাথে সমান এবং অপেরা ক্রোমিয়াম এবং ব্লিঙ্কের উপর ভিত্তি করে আমি অবাক হই না):

false results from fastest to slowest avg:
{"label":"substring","avg":0.09321}
{"label":"slice","avg":0.09463}
{"label":"lastIndexOf","avg":0.95347}
{"label":"indexOf","avg":1.6337}
{"label":"startsWith","avg":3.61454}

true results from fastest to slowest avg:
1)  {"label":"substring","avg":0.08855}
2)  {"label":"slice","avg":0.12227}
3)  {"label":"indexOf","avg":0.79914}
4)  {"label":"lastIndexOf","avg":1.05086}
5)  {"label":"startsWith","avg":3.70808}

দেখা যাচ্ছে যে প্রতিটি ব্রাউজারের নিজস্ব প্রয়োগের বিশদ রয়েছে (অপেরা ছাড়াও যা ক্রোমের ক্রোমিয়াম এবং ব্লিঙ্কের উপর ভিত্তি করে)।

অবশ্যই, বিভিন্ন ব্যবহারের ক্ষেত্রে আরও পরীক্ষা করাতে পারত এবং করা উচিত (যেমন খড়ের খড়ের তুলনায় যখন সুই খুব কম, খড়ের খড়ি যখন সূচির চেয়ে ছোট হয় ইত্যাদি ...) তবে আমার ক্ষেত্রে আমার খুব দীর্ঘ স্ট্রিংগুলির তুলনা করা দরকার এবং এটি এখানে ভাগ করতে চেয়েছিলেন।


1
var str = 'hol';
var data = 'hola mundo';
if (data.length >= str.length && data.substring(0, str.length) == str)
    return true;
else
    return false;

0

এখানে থাকা উত্তরের উপর ভিত্তি করে, এটি এখন আমি যে সংস্করণটি ব্যবহার করছি এটি জেএসপিফারফ পরীক্ষার উপর ভিত্তি করে সেরা পারফরম্যান্স দেবে বলে মনে হয় (এবং আমি যতটা বলতে পারি কার্যত সম্পূর্ণ)।

if(typeof String.prototype.startsWith != 'function'){
    String.prototype.startsWith = function(str){
        if(str == null) return false;
        var i = str.length;
        if(this.length < i) return false;
        for(--i; (i >= 0) && (this[i] === str[i]); --i) continue;
        return i < 0;
    }
}

এটি এখান থেকে শুরু উইথ 2 এর উপর ভিত্তি করে তৈরি হয়েছিল: http://jsperf.com/startswith2/6 । আমি একটি ক্ষুদ্র পারফরম্যান্স উন্নতির জন্য একটি ছোট ঝাঁকুনি যুক্ত করেছি এবং এরপরে তুলনা স্ট্রিংটি নাল বা অপরিজ্ঞাত হওয়ার জন্য একটি চেক যুক্ত করেছি এবং সিএমএসের উত্তরের কৌশলটি ব্যবহার করে স্ট্রিং প্রোটোটাইপের সাথে যুক্ত করতে রূপান্তর করেছি।

মনে রাখবেন যে এই বাস্তবায়ন " মোজিলা বিকাশকারী নেটওয়ার্ক পৃষ্ঠাতে উল্লিখিত" অবস্থান "পরামিতিকে সমর্থন করে না , তবে এটি যে কোনও উপায়ে ECMAScript প্রস্তাবের অংশ বলে মনে হয় না।


0

আমি জাভাস্ক্রিপ্টের জন্য নিশ্চিত নই তবে টাইপস্ক্রিপ্টে আমি এরকম কিছু করেছি

var str = "something";
(<String>str).startsWith("some");

আমার ধারণা এটি জেএস-তেও কাজ করা উচিত। আমি আসা করি এটা সাহায্য করবে!


-2

আপনি যদি কাজ করে থাকেন startsWith()এবং endsWith()তারপরে আপনাকে স্থান স্থানের বিষয়ে যত্নবান হতে হবে। এখানে একটি সম্পূর্ণ উদাহরণ:

var str1 = " Your String Value Here.!! "; // Starts & ends with spaces    
if (str1.startsWith("Your")) { }  // returns FALSE due to the leading spaces…
if (str1.endsWith("Here.!!")) { } // returns FALSE due to trailing spaces…

var str2 = str1.trim(); // Removes all spaces (and other white-space) from start and end of `str1`.
if (str2.startsWith("Your")) { }  // returns TRUE
if (str2.endsWith("Here.!!")) { } // returns TRUE

3
এটি অত্যন্ত মানহীন আচরণ: স্ট্রিং "abc" "abc" দিয়ে শুরু হয় না। আরও সুনির্দিষ্টভাবে, ইসিএমএ 6 কোনও ধরণের স্ট্রিং ট্রিমিং ধরে নিচ্ছে না, যাতে শ্বেত স্পেসটি শুরুতে মিলনের সাথে সাথে সঠিকভাবে মেলে।
স্টিভ হোল্যাশ

3
কী ... এই প্রশ্নের উত্তর দিচ্ছে কীভাবে?
ডিসি শ্যাননন

1
পছন্দ করেছেন এটা বোধগম্য বোকা।
মার্ক আমেরিকা

2
@ স্টিভহোল্যাশ আমার উদ্দেশ্য ছিল যে আমি যে সমস্যার মুখোমুখি হয়েছি তার সন্ধানের জন্য যে কেউ সচেতন হন। যে কাজ করে startsWith()এবং endsWith()ফাংশন করার সময় আমাদের নেতৃস্থানীয় স্থানগুলির সাথে সতর্ক হওয়া দরকার । আর কিছু না!
immayankmodi

-3

আপনি অ্যারের সমস্ত সদস্যকে অ্যারে প্রোটোটাইপে নিজের প্রোটোটাইপ / এক্সটেনশন তৈরি করে স্ট্রিং দিয়ে শুরু করতে পারেন

Array.prototype.mySearch = function (target) {
    if (typeof String.prototype.startsWith != 'function') {
        String.prototype.startsWith = function (str){
        return this.slice(0, str.length) == str;
      };
    }
    var retValues = [];
    for (var i = 0; i < this.length; i++) {
        if (this[i].startsWith(target)) { retValues.push(this[i]); }
    }
    return retValues;
};

এবং এটি ব্যবহার করতে:

var myArray = ['Hello', 'Helium', 'Hideout', 'Hamster'];
var myResult = myArray.mySearch('Hel');
// result -> Hello, Helium
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.