জাভাস্ক্রিপ্ট স্ট্রিংবিল্ডার শ্রেণিতে একটি বিল্ট আছে?


192

আমি কয়েকটি কোড প্রকল্প সমাধান দেখতে পাচ্ছি ।

তবে জাভাস্ক্রিপ্টে নিয়মিত প্রয়োগ হচ্ছে?


উত্তর:


318

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

যখন আমাকে প্রচুর স্ট্রিং কনটেন্টেশন করতে হয় আমি সাধারণত একটি অ্যারে পূরণ করি এবং স্ট্রিং নির্মাতা শ্রেণি ব্যবহার করি না:

var html = [];
html.push(
  "<html>",
  "<body>",
  "bla bla bla",
  "</body>",
  "</html>"
);
return html.join("");

নোট করুন যে pushপদ্ধতিগুলি একাধিক যুক্তি গ্রহণ করে।


7
এবং যদি আপনি আউটপুট ইনলাইন জেনারেট করে থাকেন বা সমস্ত সদস্যও আক্ষরিক, [foo(), "bar", "baz"].join("");কাজ করে।
বেনামে

1
যদিও কেউ সম্ভবত ড্রপবক্স লিঙ্কগুলি প্রায় 3 বছর ধরে কাজ করার আশা করতে পারে না, আমি তুলনা সম্পর্কে আগ্রহী হব - এবং যদি এটি এখনও ধরে রাখে।
কর্নেলিয়াস

1
@ ডেভ ওয়ার্ড, আপনার লিঙ্কটি নষ্ট হয়েছে :(
ইভান কোচুরকিন

আমি এটি স্ট্রিং + স্ট্রিং + স্ট্রিংয়ের অনেক বেশি পঠনযোগ্য বলে মনে করি
অ্যান্ড্রু এহরিচ

12
আমি জানতাম না pushএকাধিক যুক্তি গ্রহণ করতে পারে। এলোমেলো জিনিস আপনি শিখেন।
কারসিজেনিকেট

55

আমি কেবল http://jsperf.com/javascript-concat-vs-join/2 এ পারফর্মেন্সটি যাচাই করেছি । পরীক্ষার ক্ষেত্রে কেসনেটেট বা বর্ণমালায় 1,000 বার যোগদান হয়।

বর্তমান ব্রাউজারগুলিতে (এফএফ, অপেরা, আইই ১১, ক্রোম) "কনক্যাট" "যোগদান" এর চেয়ে প্রায় 4-10 গুণ বেশি গতিযুক্ত।

আইই 8 তে উভয়ই সমান ফলাফল নিয়ে আসে।

আই 7-তে, "যোগদান" দুর্ভাগ্যক্রমে প্রায় 100 গুণ দ্রুত faster


3
এর জন্য ধন্যবাদ. এটি উত্তর তালিকায় ছড়িয়ে দেওয়া উচিত। এটি আইই 10 তেও খুব দ্রুত (আমি জানি এটি কোনও আধুনিক ব্রাউজার নয় তবে আমি এটি দেখতে কোনও সম্ভাব্য এনএমসিআই বিকাশকারীদের জন্য এটি উল্লেখ করেছি)।
জেমস উইলসন

@ অ্যান্ড্রেয়াস আমি বিশ্বাস করি আপনার ক্রোমটি ক্রোমে এমন কোনও কোড পাথ করছে যেহেতু এটি সত্যিকারের কনটেনেট কখনওই করছে না কারণ স্ট্রিংটি কখনই পড়া হয় না। এমনকি এটি বাধ্য করার পরেও মৃত্যুদন্ড কার্যকর করার গতিটি এখনও বেশ দ্রুত: jsperf.com/yet-another-string-concat-test/1
জোসেফ

37

না, স্ট্রিংগুলি তৈরি করার জন্য কোনও অন্তর্নির্মিত সমর্থন নেই। পরিবর্তে আপনাকে কনক্রিটেশন ব্যবহার করতে হবে।

আপনি অবশ্যই আপনার স্ট্রিংয়ের বিভিন্ন অংশের একটি অ্যারে তৈরি করতে পারেন এবং তারপরে join()সেই অ্যারেটিতে কল করতে পারেন, তবে এটি আপনি যে জাভাস্ক্রিপ্ট দোভাষী ব্যবহার করছেন তাতে কীভাবে যোগদানটি প্রয়োগ করা হবে তার উপর নির্ভর করে।

str1+str2পদ্ধতির বনাম array.push(str1, str2).join()পদ্ধতির গতির তুলনা করার জন্য আমি একটি পরীক্ষা করেছি । কোডটি সহজ ছিল:

var iIterations =800000;
var d1 = (new Date()).valueOf();
str1 = "";
for (var i = 0; i<iIterations; i++)
    str1 = str1 + Math.random().toString();
var d2 = (new Date()).valueOf();
log("Time (strings): " + (d2-d1));

var d3 = (new Date()).valueOf();
arr1 = [];
for (var i = 0; i<iIterations; i++)
    arr1.push(Math.random().toString());
var str2 = arr1.join("");
var d4 = (new Date()).valueOf();
log("Time (arrays): " + (d4-d3));

আমি এটি একটি উইন্ডোজ 7 এক্স 64 এ উভয়ই ইন্টারনেট এক্সপ্লোরার 8 এবং ফায়ারফক্স 3.5.5 এ পরীক্ষা করেছি।

শুরুতে আমি স্বল্প সংখ্যক পুনরাবৃত্তির উপর পরীক্ষা করেছি (কয়েকশো, কয়েক হাজার আইটেম)। ফলাফলগুলি অনির্দেশ্য ছিল (কখনও কখনও স্ট্রিং কনটেনটেশন 0 মিলিসেকেন্ড নেয়, কখনও কখনও এটি 16 মিলিসেকেন্ড নেয়, অ্যারে যোগদানের জন্য একই)।

আমি যখন গণনাটি 50,000 এ বাড়িয়েছি, তখন বিভিন্ন ব্রাউজারে ফলাফলগুলি আলাদা ছিল - ইন্টারনেট এক্সপ্লোরারে স্ট্রিং কনটেন্টেশনটি দ্রুত ছিল (94 মিলিসেকেন্ড) এবং ফায়ারফক্সে অ্যারে যোগটি দ্রুত ছিল (113 মিলিসেকেন্ড) স্ট্রিং যোগদান (117 মিলিসেকেন্ড)।

তারপরে আমি গণনাটি 500'000 এ বাড়িয়েছি। এখন উভয় ব্রাউজারে স্ট্রিং কনটেনটেশনের চেয়ে ধীরarray.join() ছিল : স্ট্রিং কনটেনটেশনটি ইন্টারনেট এক্সপ্লোরারে 937 এমএস, ফায়ারফক্সে 1155 এমএস, ইন্টারনেট এক্সপ্লোরারে অ্যারে 1265 এবং ফায়ারফক্সে 1207 এমএস ছিল।

850,000 ডলার ছিল "স্ক্রিপ্টটি কার্যকর হতে খুব বেশি সময় নিচ্ছে" না করেই আমি ইন্টারনেট এক্সপ্লোরারে পরীক্ষা করতে পারতাম সর্বোচ্চ পুনরাবৃত্তি গণনা count তারপরে ইন্টারনেট এক্সপ্লোরারটির স্ট্রিং কনটেনটেশনের জন্য 1593 এবং অ্যারে জোনের জন্য 2046, এবং ফায়ারফক্সের স্ট্রিং কনটেনটেশনের জন্য 2101 এবং অ্যারে জয়েনের জন্য 2249 ছিল।

ফলাফল - পুনরাবৃত্তির সংখ্যা যদি কম হয় তবে আপনি ব্যবহারের চেষ্টা করতে পারেন array.join(), কারণ এটি ফায়ারফক্সে আরও দ্রুত হতে পারে। সংখ্যাটি বাড়লে, string1+string2পদ্ধতিটি দ্রুত হয়।

হালনাগাদ

আমি ইন্টারনেট এক্সপ্লোরার 6 (উইন্ডোজ এক্সপি) এ পরীক্ষাটি করেছিলাম। প্রক্রিয়াটি তাত্ক্ষণিক প্রতিক্রিয়া জানাতে থামিয়েছিল এবং কখনই শেষ হয় না, যদি আমি ১০,০০,০০০ এরও বেশি পুনরাবৃত্তিতে পরীক্ষার চেষ্টা করি। 40,000 পুনরাবৃত্তিতে ফলাফল ছিল

Time (strings): 59175 ms
Time (arrays): 220 ms

এর অর্থ হল - আপনার যদি ইন্টারনেট এক্সপ্লোরার 6 সমর্থন করতে হয়, array.join()তবে স্ট্রিং কনকেন্টেশনের চেয়ে দ্রুত কোনটি চয়ন করুন ।


join()ECMAScript এর অংশ এবং প্রতি জাভাস্ক্রিপ্ট ইন্টারপ্রেটার এটি প্রয়োগ করে। কেন এটি "নির্ভর" হবে?
এলি গ্রে

তার অর্থ কীভাবে এটি বাস্তবায়িত হয়েছিল ... যদি এটি এমনভাবে প্রয়োগ করা হয় যে কোনও লুপে, স্ট্রিংটি ক্রমাগত সমস্ত একবারে তৈরির বিরোধী করে দেওয়া হয়, তবে যোগদানের ব্যবহার অর্থহীন হবে
জন

হ্যাঁ, এটি আসলে আমি বলতে চাইছিলাম আমার ইংরাজিকে ক্ষমা করুন ;-) আমি দুটি ব্রাউজারে কোন পদ্ধতিটি দ্রুত কাজ করে তার তুলনার ফলাফল যুক্ত করেছি added আপনি দেখতে পাচ্ছেন, এটি আলাদা।
নাইভিস্ট

2
আই 6, বরাবরের মতোই এর ব্যতিক্রম :)
গর্ডন টকার

10
আই 6 সহ লোকেরা যদিও সবকিছু ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে চলতে অভ্যস্ত। আমি মনে করি না তারা আপনাকে দোষ দেবে।
লোডেভিজক

8

এই কোডটি কিছু পরিবর্তন হিসাবে আপনি নিতে চাইছেন এমন রাস্তার মতো দেখাচ্ছে।

আপনি দেখতে এই জাতীয় চেহারা পরিবর্তন করতে চান। 0 নম্বরটি গ্রহণ করার জন্য এবং এটিকে ফিরে আসার জন্য আমি এটি পরিবর্তন করেছি thisযাতে আপনি নিজের সংযোজনগুলি শৃঙ্খলে রাখতে পারেন ।

StringBuilder.prototype.append = function (value) {
    if (value || value === 0) {
        this.strings.push(value);
    }
    return this;
}

কেন কেবল নন-নন নম্বর এবং খালি খালি স্ট্রিং গ্রহণ করবেন? তোমার পদ্ধতি গ্রহণ করবে না null, falseখালি স্ট্রিং, undefinedবা NaN
এলি গ্রে

@ এলিজা - আমি বৈধ স্ট্রিংস এবং সংখ্যাগুলি ছাড়া আর কিছু না মেনে আমার স্ট্রিংবিল্ডার ক্লাসকে পরিষ্কার রাখতে পছন্দ করি। এটি কেবল একটি ব্যক্তিগত পছন্দ।
গর্ডন টকার

5

জাভাস্ক্রিপ্টের ECMAScript 6 সংস্করণ (ওরফে ECMAScript 2015) স্ট্রিং আক্ষরিক পরিচয় করিয়ে দিয়েছে ।

var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;

লক্ষ্য করুন যে ব্যাক-টিকগুলি একক উদ্ধৃতির পরিবর্তে স্ট্রিংটি আবদ্ধ করুন।


17
কিভাবে এই প্রশ্নের উত্তর দেয়?
পিটার মর্টেনসেন

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

1
এটি প্রশ্নের উত্তর দেয় না। মোটেই
ম্যাসিমিলিয়ানো ক্রাউস

3

সি # তে আপনি এর মতো কিছু করতে পারেন

 String.Format("hello {0}, your age is {1}.",  "John",  29) 

জাভাস্ক্রিপ্টে আপনি এর মতো কিছু করতে পারেন

 var x = "hello {0}, your age is {1}";
 x = x.replace(/\{0\}/g, "John");
 x = x.replace(/\{1\}/g, 29);

2
আমি দৃ doubt়ভাবে সন্দেহ করি যে স্ট্রিং
জয়েনের

তদ্ব্যতীত, এটি একটি ভয়াবহ বাস্তবায়ন। যে স্ট্রিংটি {0}প্রতিস্থাপন করা হয়েছে তাতে যদি তা থাকে তবে এটি ভেঙে যাবে {1}
ইকগামি

@ ইকগামি স্ট্রিংটি একটি পরিবর্তনশীল নয়, একটি ধ্রুবক, তাই আপনি কী জানেন যে একটি প্রাইরি রয়েছে।
স্পোর্টস

@ স্পোর্টস, আপনার কোড জুড়ে এগুলি সমস্ত অনুলিপি করা এবং আটকানো একটি আরও খারাপ ধারণা।
ইকেগামী

Lin 1 এবং $ 2 সহ একটি লাইনার নন-ক্যাপচার গ্রুপগুলি প্রতিস্থাপন করছে: x..replace (/ ([\ s \ S] *?)) \ {0 \} ([\ s \ S] *?) \ {1 \} / g, "$ 1Tom $ 225")
টি.সি.কে

1

আগ্রহীদের জন্য, অ্যারে.জয়িনকে আহ্বান করার বিকল্প এখানে রয়েছে:

var arrayOfStrings = ['foo', 'bar'];
var result = String.concat.apply(null, arrayOfStrings);
console.log(result);

আশানুরূপ আউটপুট হ'ল স্ট্রিং 'ফুবার'। ফায়ারফক্সে, এই পদ্ধতির অ্যারে.জয়িনকে ছাড়িয়ে যায় তবে + কনটেনটেশন দ্বারা ছাড়িয়ে যায়। স্ট্রিংকনক্যাট যেহেতু প্রতিটি বিভাগকে পৃথক যুক্তি হিসাবে নির্দিষ্ট করা প্রয়োজন, তাই কলকারী জাভাস্ক্রিপ্ট ইঞ্জিন দ্বারা চালিত কোনও যুক্তি গণনা সীমা দ্বারা সীমাবদ্ধ। কটাক্ষপাত Function.prototype.apply () ডকুমেন্টেশন দেখুন।


এটি ক্রোমে ব্যর্থ হয়, যেহেতু "স্ট্রিংকনক্যাট" অপরিজ্ঞাত। পরিবর্তে, আপনি '' .concat.apply ('', অ্যারেঅফস স্ট্রিংস) ব্যবহার করতে পারেন। তবে এটি এখনও একটি খুব ধীর পদ্ধতি।
Andreas

1

আমি এই ফাংশনটি সংজ্ঞায়িত করেছি:

function format() {
        var args = arguments;
        if (args.length <= 1) { 
            return args;
        }
        var result = args[0];
        for (var i = 1; i < args.length; i++) {
            result = result.replace(new RegExp("\\{" + (i - 1) + "\\}", "g"), args[i]);
        }
        return result;
    }

এবং সি # এর মতো বলা যেতে পারে:

 var text = format("hello {0}, your age is {1}.",  "John",  29);

ফলাফল:

হ্যালো জন, আপনার বয়স 29


1
আমি এটি পছন্দ করি ... সি # এর মতো দেখাচ্ছে
আইও অ্যাডেসিনা

2
এই প্রশ্নের প্রশ্নের সাথে কোনও সম্পর্ক নেই।
ম্যাসিমিলিয়ানো ক্রাউস

0

যখন আমি জাভাস্ক্রিপ্টে নিজেকে অনেকগুলি স্ট্রিং কনটেনটেশন করতে দেখি তখন আমি টেম্প্লেটিংয়ের সন্ধান শুরু করি। Handlebars.js এইচটিএমএল এবং জাভাস্ক্রিপ্টকে আরও পাঠযোগ্য keeping http://handlebarsjs.com


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