স্ট্রিংটি চেক করার দ্রুততম পদ্ধতিতে জাভাস্ক্রিপ্টে অন্য একটি স্ট্রিং রয়েছে?


163

আমি জাভাস্ক্রিপ্টে একটি পারফরম্যান্স সমস্যা নিয়ে কাজ করছি। সুতরাং আমি কেবল জিজ্ঞাসা করতে চাই: একটি স্ট্রিংয়ে অন্য সাবস্ট্রিং রয়েছে কিনা তা যাচাই করার দ্রুততম উপায় কী (আমার কেবল বুলিয়ান মান প্রয়োজন)? আপনি দয়া করে আপনার ধারণা এবং নমুনা স্নিপেট কোড প্রস্তাব করতে পারেন?


আপনি কি একটি নির্দিষ্ট সাবস্ট্রিংয়ের বিষয়ে জিজ্ঞাসা করছেন, বা আপনার কি নিয়মিত অভিব্যক্তি প্রয়োজন (আমি regexট্যাগ ব্যবহার করে কিছুটা বিভ্রান্ত হয়েছি )?
টিম পিটজ্যাকার

1
এই পোস্টটি সহায়ক হবে .. stackoverflow.com/questions/1789945/javascript-string-contains
এমটিকে

হোয়াইটস্পেসের চারপাশে একটি অ্যারেতে স্ট্রিংটি বিভক্ত করা এবং অ্যারে ছেদ করা কীভাবে? stackoverflow.com/questions/1885557/...
giorgio79

উত্তর:


315

আপনার দুটি সম্ভাব্য লোক রয়েছে:

  1. নিয়মিত প্রকাশ :

    (new RegExp('word')).test(str)
    // or
    /word/.test(str)
  2. indexOf:

    str.indexOf('word') !== -1

নিয়মিত প্রকাশগুলি দ্রুত বলে মনে হয় (কমপক্ষে Chrome 10 এ)।

পারফরম্যান্স পরীক্ষা - সংক্ষিপ্ত খড়ের গর্ত
পারফরম্যান্স পরীক্ষা - লম্বা খড়ের কাটা


২০১১ আপডেট করুন:

কোন পদ্ধতিটি দ্রুত তা নিশ্চিত করে বলা যায় না। ব্রাউজারগুলির মধ্যে পার্থক্যগুলি বিশাল। ক্রোম 10 indexOfতে দ্রুত বলে মনে হচ্ছে, সাফারি 5-তে, indexOfঅন্য যে কোনও পদ্ধতির চেয়ে স্পষ্টভাবে ধীর।

আপনাকে দেখতে হবে এবং নিজের জন্য চেষ্টা করতে হবে। এটি আপনার প্রয়োজনের উপর নির্ভর করে। উদাহরণস্বরূপ, কেস-সংবেদনশীল অনুসন্ধান নিয়মিত প্রকাশের সাথে দ্রুত হয়।


আপডেট 2018:

লোকেরা নিজেরাই পরীক্ষা চালানো থেকে বাঁচানোর জন্য, এখানে বেশিরভাগ সাধারণ ব্রাউজারগুলির বর্তমান ফলাফল রয়েছে, শতাংশগুলি পরবর্তী দ্রুত ফলাফলের (যা ব্রাউজারগুলির মধ্যে পরিবর্তিত হয়) তুলনায় কর্মক্ষমতা বৃদ্ধি ইঙ্গিত করে:

ক্রোম: ইনডেক্সফ (~ 98% দ্রুত) <-- wow
ফায়ারফক্স: ক্যাশেড রেজিএক্সপ (~ 18% দ্রুত) আই 11
: ক্যাশেড রেজিএক্সপ (~ 10% দ্রুত)
প্রান্ত: ইনডেক্সফ (~ 18% দ্রুত)
সাফারি: ক্যাশেড রেজিএক্সপ (.4 0.4% দ্রুত)

নোট করুন যে ক্যাশেড রেজিএক্সপ্স : এর var r = new RegExp('simple'); var c = r.test(str);বিপরীতে:/simple/.test(str)


3
এটি কেবল তখনই একটু দ্রুত হতে পারে যখন পাঠ্য-থেকে-অনুসন্ধানের জন্য হাতের আগে পরিচিত (যেমন কোনও ভেরিয়েবলে সঞ্চিত নয়) কারণ রেসেক্সটি পার্স সময়ের সময়ে জাভাস্ক্রিপ্ট ইঞ্জিন দ্বারা তৈরি করা হয়েছিল। আপনি যদি অন্য স্ট্রিং ভেরিয়েবলের ভিতরে কোনও ভেরিয়েবলের মধ্যে থাকা স্ট্রিংটি অনুসন্ধান করতে চান, তবে সূচিপত্র দ্রুততম কারণ আপনার একটি রেজিএক্সপ্যাক্ট তৈরি করতে হবে এবং স্ট্রিংটি বিশেষ অক্ষরগুলি থেকে বাঁচতে প্রক্রিয়া করতে হবে
স্টিফেন চুং

অভিজ্ঞতা থেকে, সূচিপত্র কেস-সংবেদনশীল অনুসন্ধানের জন্য দ্রুত হতে পারে যদি আপনি .toLowerCase ব্যবহার করেন যা আপনি প্রথমে অনুসন্ধান করছেন
হায়াক সাকিয়ান

আমি একটি অফিস 2013 অ্যাপ লিখছি, মাইক্রোসফ্টের অফিস জাভাস্ক্রিপ্ট এপিআই ব্যবহার indexOfকরে এবং ব্যবহার করে কাজ হচ্ছে না। আমি নিশ্চিত না কেন। রিজেেক্স যদিও ব্যবহার করছে। এটি একটি প্রান্তের মামলা, তবে অন্যরাও হয়ত একই সমস্যাতে চলে।
অ্যান্ডি মার্সার

কোনও কারণে সাবস্ট্রাস্ট () কোনও সম্ভাব্য সমাধান নয়? আমি অনুমান করতে পারি এটি অনেক পরিস্থিতিতে RegEx সমাধানের চেয়ে অনেক দ্রুত। আমি জানি না এটি কীভাবে ইন্ডেক্সঅফের সাথে তুলনা করে () যদিও (তাই যদি আপনি এটি ছেড়ে চলে যান কারণ এটি সবসময় ইনডেক্সফের চেয়ে খারাপ সম্পাদন করে) তবে এটি ঠিক আছে, সম্ভবত সেই প্রভাবটিতে একটি নোট যুক্ত করুন।) সম্পাদনা: এই জেএসপার্ফ লিঙ্কটি কিছু আকর্ষণীয় দেখায় ফলাফল নেই। সংক্ষিপ্ত সংস্করণ: সূচিপত্র () সমস্ত পদ্ধতির মধ্যে দ্রুততম, তবে স্ট্রিং দৈর্ঘ্য এবং যে কোনও পুনরাবৃত্তি প্যাটার্নের ভিত্তিতে এটি পৃথক হতে পারে।
বাইসন

1
@ বাইসন: আপনি কেবল সাবস্ট্রাস্ট ব্যবহার করতে পারেন যদি আপনি ইতিমধ্যে কোথায় দেখতে হবে তা জানেন। আমি কেবল জেনেরিক সমাধানগুলিতে মনোনিবেশ করেছি।
ফেলিক্স ক্লিং

17

এটি কি তোমার জন্য কাজ করে?

string1.indexOf(string2) >= 0

সম্পাদনা: স্ট্রিং 2-এ পুনরাবৃত্ত নিদর্শনগুলি থাকলে এটি কোনও রেজিপ্লেক্সের চেয়ে দ্রুততর হতে পারে না। কিছু ব্রাউজারে, সূচিপত্রগুলি রেজিএক্সপ্যাকের চেয়ে অনেক ধীর হতে পারে। মন্তব্য দেখুন।

সম্পাদনা 2: স্ট্রিংগুলি খুব দীর্ঘ এবং / অথবা পুনরাবৃত্ত নিদর্শনগুলি থাকতে পারে যখন RegExp সূচকের চেয়ে দ্রুত হতে পারে। মন্তব্য এবং @ ফেলিক্স এর উত্তর দেখুন।


তবে এটি অন্যান্য পদ্ধতির সাথে কীভাবে তুলনা করে? এটি কি দ্রুততম, না এটি করার অনেকগুলি পদ্ধতির মধ্যে এটি কেবল একটি?
চিই

এটি নিজেই জাভাস্ক্রিপ্ট দ্বারা প্রয়োগ করা হয়েছে (যেমন এটি নেটিভ কোড চালায়) এটি দ্রুত হওয়া উচিত। জাভাস্ক্রিপ্ট কোড ভিত্তিক অন্য যে কোনও পদ্ধতি ধীর হবে be আপনি যদি সঠিক স্ট্রিংটি জানেন তবে একটি রেজেক্স কিছুটা দ্রুত হতে পারে (জাভাস্ক্রিপ্ট ইঞ্জিনটিকে .indexOf সন্ধানের জন্য প্রোটোটাইপ চেইনে হাঁটতে হবে না)।
স্টিফেন চুং

আপনার যদি কেস-সংবেদনশীল অনুসন্ধানের প্রয়োজন হয় তবে অবশ্যই আপনার একটি রেজিপ্লেক্স অবজেক্ট তৈরি করতে হবে এবং কল করতে হবে test
স্টিফেন চুং

3
সবে সাফারিতে একটি পরীক্ষা চালিয়েছি। indexOfঅন্য যে কোনও পদ্ধতির চেয়ে ধীর গতি। সুতরাং আসলে কোন পদ্ধতিটি দ্রুত তা বলা যায় না। এটি ব্রাউজার থেকে ব্রাউজারে পরিবর্তিত হয়।
ফেলিক্স ক্লিং

@ ফেলিক্স, এটি একটি ভাল পর্যবেক্ষণ (আপনি নিজেরাই এটি চেষ্টা না করা পর্যন্ত কোনও কিছুর উপর নির্ভর করবেন না)! আমি অস্পষ্ট কিছু মনে করে যা প্রচুর পুনরাবৃত্ত নিদর্শনগুলির সাথে স্ট্রিংগুলিতে বলে, রেগেক্সের একটি সাধারণ লুপ তুলনা বাস্তবায়নের চেয়ে দ্রুত সঞ্চালন করা উচিত কারণ রিজেক্সগুলি রাষ্ট্রের মেশিনগুলিতে সংকলিত হয় এবং এটি সরল লুপগুলির চেয়ে অনেক দ্রুত ব্যাক-ট্র্যাক করতে পারে - যা সর্বদা ফিরে যেতে হয় - পরবর্তী অক্ষর ট্র্যাক। পরীক্ষাটি করার জন্য এবং এটি বের করে আনার জন্য +1!
স্টিফেন চুং

17

দ্রুততর

  1. (ES6) এর অন্তর্ভুক্ত
    var স্ট্রিং = "হ্যালো",
    সাবস্ট্রিং = "লো";
    string.includes (সাবস্ট্রিং);
  1. ES5 এবং পুরানো সূচিপত্র
    var স্ট্রিং = "হ্যালো",
    সাবস্ট্রিং = "লো";
    string.indexOf (সাবস্ট্রিং)! == -1;

http://jsben.ch/9cwLJ

এখানে চিত্র বর্ণনা লিখুন


8

ES6-এ, includes()পদ্ধতিটি একটি স্ট্রিং অন্য স্ট্রিংয়ের মধ্যে ফিরে পাওয়া trueবা falseযথাযথ হিসাবে পাওয়া যেতে পারে কিনা তা নির্ধারণ করতে ব্যবহৃত হয় ।

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

console.log(str.includes('To be'));       // true
console.log(str.includes('question'));    // true
console.log(str.includes('nonexistent')); // false

এখানে jsperf হয়

var ret = str.includes('one');

এবং

var ret = (str.indexOf('one') !== -1);

ফলটি jsperf এ প্রদর্শিত হিসাবে, দেখে মনে হচ্ছে দুজনেই ভাল পারফর্ম করে।


আমি কী "অভ্যন্তরীণ" যুক্তিটি অন্তর্ভুক্ত করে "ভিতরে" ব্যবহার করতে পারি? ভালো লেগেছে: str.includes("x|y"); একই কলের আক্ষরিক "x" বা "y" অনুসন্ধান করুন।
ptkato

@ পেট্রিক, প্রতি অন্তর্ভুক্ত ডক, আপনি regexএটি ব্যবহার করতে পারবেন না । আপনার প্রশ্নের জন্য একটি কাজ প্রায়শই,str.includes("x") || str.includes('y')
zangw

ক্রোম 59 জাভাস্ক্রিপ্ট উন্নতির ফলস্বরূপ, indexOfতুলনায় উল্লেখযোগ্যভাবে দ্রুত includes(1600% এর উপরে)। এটি স্পষ্ট নয় যে কীভাবে ৪৪ মিলিয়ন পুনরাবৃত্তি / সেকেন্ড এবং 7 777+ মিলিয়ন আই / সেকেন্ডের পার্থক্য রিয়েল-ওয়ার্ল্ড পারফরম্যান্সকে প্রভাবিত করে, তবে মোবাইলের পক্ষে সম্ভবত যথেষ্ট উপকার হয় indexOfযা আদর্শ পছন্দ হওয়া উচিত।
চাদ লেভি

7

আমি পেয়েছি, লুপ জন্য একটি সহজ ব্যবহার স্ট্রিং সব উপাদান উপর iterating এবং ব্যবহার তুলনা যে charAtযতো তাড়াতাড়ি সঞ্চালিত indexOfবা Regex। কোড এবং প্রমাণ জেএসপিআইপিএফউপলব্ধ

ইটিএ: indexOfএবং charAtদু'জনই জেএসপিফার ডটকমের তালিকাভুক্ত ব্রাউজার স্কোপ ডেটা অনুসারে ক্রোম মোবাইলে একই রকম ভয়ঙ্কর অভিনয় করে


অদ্ভুত যে একটি হাতে নির্মিত ফাংশনটি একটি অন্তর্নির্মিতের চেয়ে ভাল তবে আমার ধারণা এটি এটি কারণ কেবল সূত্রটি একটি চরিত্র। তবু ...
মস

অ্যাপল আইপ্যাডে (আইওএস 7.1.1) ক্রোম মোবাইল 36.0.1985.57 এ পরীক্ষিত। সূচক দ্রুত হয়। দুঃখিত
rpax

@rpax CharAt এখনও ক্রোম মোবাইল ব্যতীত সমস্ত প্ল্যাটফর্মগুলিতে (jsperf থেকে ইতিহাসের ভিত্তিতে) উল্লেখযোগ্যভাবে দ্রুতগতির , যেখানে ডেস্কটপের তুলনায় সূচিপত্র এবং চারআউট উভয়ই সমানভাবে খারাপ সঞ্চালন করে।
wpg4665

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

এটি মোটেই বৈধ উত্তর নয়। আপনি কোনও স্ট্রিং অনুসন্ধান করছেন না, কেবল একটি একক চরিত্রের উপস্থিতি
হেনরিক মেন্ট্টি

3

একটি সরল স্ট্রিং সন্ধানের জন্য, ইনডেক্সফ () পদ্ধতিটি ব্যবহার করে এবং রেইগেক্স ব্যবহার করা প্রায় একই রকম: http://jsperf.com/substring - তাই লিখতে কোনটি সহজ বলে মনে হয় তা বেছে নিন।



1

.match()স্ট্রিংয়ের পদ্ধতিটি ব্যবহারের এটি সহজ উপায় ।

var re = /(AND|OR|MAYBE)/;
var str = "IT'S MAYBE BETTER WAY TO USE .MATCH() METHOD TO STRING";
console.log('Do we found something?', Boolean(str.match(re)));

স্যার আপনার দিনটি শুভ কামনা করুন!


4
কোনও পদ্ধতি matchথাকার কারণ নেই test… শীর্ষ উত্তরটি দেখুন।
বার্গি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.