Skip to content

Chapter 14: JavaScript String Methods

14-1: মিউট থাক immutable স্ট্রিং

String Methods

তুই আগে থেকে জানস, String হচ্ছে এক বা একাধিক বর্ণের সমষ্টি। তবে string-এর একটা গোপন বিষয় হচ্ছে, String জিনিসটা কিন্তু অনেকটা array-এর মতো, এটা দেখে প্রথম প্রথম বিশ্বাস কম হবে, তবে একটু পরে বিশ্বাস হবে। তবে তার আগে কয়েকটা স্ট্রিংয়ের উদাহরণ দেখ—

javascript
  const country = 'Bangladesh';
  const division = "Noakhali";

এখন আবার একটা অ্যারে ডিক্লেয়ার করলি—

  const numbers = [54, 98, 78, 21, 65];

অ্যারের মধ্যে অনেকগুলো উপাদান আছে এবং সবগুলো উপাদানই কমা(,) দিয়ে আলাদা করা রয়েছে। তুই জানস যে, অ্যারের উপাদানগুলোকে এক্সেস করার জন্য তার index ব্যবহার করতে হয় এবং array-এর indexing শুরু হয় শূন্য থেকে। যেমন, 0 ইনডেক্সে আছে 54, 1 ইনডেক্সে আছে 98, 2 ইনডেক্সে আছে 78, 3 ইনডেক্সে আছে 21, 4 ইনডেক্সে আছে 65 এবং তুই এটাও জানস যে, numbers.length লিখে array-এর length বের করতে পারবি।

এই জিনিসটা স্ট্রিংয়ের সাথেও সেইম।

যেমন ধর, তুই একটা স্ট্রিং ডিক্লেয়ার করলি—

javascript
const capital = "Dhaka";

এখন তুই চাইলে capital.length লিখে console.log করে দেখবি, output-এ 5 দেখাচ্ছে। এটা দিয়ে কী বুঝাচ্ছে? এটা দিয়ে বুঝায়, capital নামক ভেরিয়েবলের মধ্যে যে স্ট্রিং আছে, সেটার মধ্যে পাঁচটা ক্যারেক্টার আছে।

javascript
const capital = "Dhaka";
console.log(capital.length);

Output: 5;

এখন যদি তুই ঢাকার মধ্যে একটু ফাঁকা করে দিলি। অর্থাৎ Dha-এর পর একটু স্পেস বা গ্যাপ দিয়ে দিলি, তাহলেও দেখলে capital নামক ভেরিয়েবলের মধ্যে 5টা ক্যারেক্টারই থাকে। তবে লেংথ কি 5 হবে? সেটা দেখার জন্য আউটপুটটা দেখ—

javascript
const capital = "Dha ka";
console.log(capital.length);

Output: 6;

তাহলে এটা বোঝা যাচ্ছে যে, সব সময় যে .length দিয়ে total character বুঝাবে, তা কিন্তু না। এখানে বুঝাচ্ছে, কতটুকু জায়গা সে নিয়েছে। Dha আর ka-এর মধ্যে যে একটা খালি জায়গা আছে, সেটাও কিন্তু একটা জিনিস। সেখানে খালি রাখার জন্যও কিন্তু সে একটু জায়গা রেখেছে। অনেকটা রাস্তা, ড্রেন বা খালের জন্য মাঝেমধ্যে জায়গা খালি রাখলেও সেটা কিন্তু একটা জায়গা হিসেবে কাউন্ট হবে। সেজন্যই লেংথ একটা বেড়ে গেছে।

শুধু length না; বরং তুই যেভাবে অ্যারের প্রতিটা উপাদান index-এর মাধ্যমে এক্সেস করতে পারতি, ঠিক একইভাবেও string-এর সব উপাদান একসেস করতে পারবি।

javascript
const capital = "Dhaka";
console.log(capital[0]);

Output: D;

আছে কি নাই?

অ্যারের মতো কোনো স্ট্রিংয়ে নির্দিষ্ট অক্ষর বা শব্দ আছে কি না, তা যাচাই করতে includes() মেথড ব্যবহার করতে পারবি।

javascript
const name = "Abid";
console.log(name.includes("d"));

Output: true;

এমনকি indexOf দিয়ে চেক করতে পারবি, কোনো একটা উপাদান (বা একাধিক ক্যারেক্টার) স্ট্রিংয়ের মধ্যে কোন ইনডেক্সে আছে। যদি থাকে, তাহলে সেই ইনডেক্স রিটার্ন করবে। আর যদি না থাকে, তাহলে -1 ইনডেক্স হিসেবে রিটার্ন করবে।

javascript
const language = "javascript";
console.log(language.indexOf("rip"));
console.log(language.indexOf("py"));

Output: 6 - 1;

এর মাধ্যমে বোঝাই যাচ্ছে যে, string কিছুটা অ্যারের মতো। কিছুটা বলেছি, পুরোপুরি যে সেইম, তা কিন্তু বলিনি। এইবার তোর মনে প্রশ্ন জাগতে পারে, কিন্তুটা কই? কিন্তু হচ্ছে, তুই চাইলে index দিয়ে অ্যারের যেকোনো পজিশনের উপাদানের মান চেইঞ্জ করতে পারবি। নিচের মতো করে।

javascript
const numbers = [54, 98, 78, 21, 65];
numbers[1] = 11;
console.log(numbers);

Output: [54, 11, 78, 21, 65];

কিন্তু এই কাজ string-এ করতে পারবি না। তুই ইনডেক্স দিয়ে স্ট্রিংয়ের মধ্যে কিছু আপডেট করতে পারবি না।

javascript
const capital = "Dhaka";
capital[0] = "F";
console.log(capital);

Output: Dhaka;

এইখানে ঘটনা হচ্ছে— স্ট্রিং চেইঞ্জেবল না। এইটাকে একবার সেট করলে আর চেইঞ্জ করা যায় না। এই যে চেইঞ্জ করা যায় না, এইটাকে কঠিনভাবে বললে, কেউ কেউ বলে স্ট্রিং হচ্ছে immutable। এইটা একটা কঠিন শব্দ। তবে এইটাকে ভাঙলে বুঝা যায়, immutable মানে হচ্ছে not mutable বা not changeable।

অন্য দিকে অ্যারে চেইঞ্জ করা যায় বলে সেটাকে changeable বা mutable বলে। চেইঞ্জ করতে পারবি মানে— কোনো পজিশনে আগের মান চাইলে পরিবর্তন করে নতুন আরেক মান দেয়া যায়। আবার দরকার হলে উপাদান push করা যায়। pop করে বের করা যায়।

এত কিছু কঠিন মনে হলে জাস্ট আরেকবার খেয়াল কর, অ্যারে হচ্ছে mutable আর স্ট্রিং হচ্ছে immutable।

শেষ কথা হচ্ছে, স্ট্রিং অ্যারে না। তবে তারা বেশি দূরেরও না।

Practice:

  1. একটা স্ট্রিং বানা city, যার মান হবে Chattogram। এবার indexOf দিয়ে বের কর, g কোন ইনডেক্সে আছে।
  2. একটা স্ট্রিং বানা division, যার মান হবে Sylhet। includes দিয়ে দেখ, এই স্ট্রিংয়ের মধ্যে y আছে কি না।
  3. const name = 'Rifat'; স্ট্রিংয়ের শেষ ক্যারেক্টার বের কর।
  4. একটা স্ট্রিং বানা language, যার মান হবে javascript। এবার indexOf দিয়ে চেক কর, rip কোন ইনডেক্সে শুরু হয়েছে।
  5. const text = 'Immutable'; স্ট্রিংয়ের দৈর্ঘ্য বের কর এবং চেক কর এটি mutable কি না।

14-2: Lower-Upper সমান সমান

Lower Upper

বাংলা সিনেমায় দেখস না, চৌধুরী সাহেব এসে জ্বালাময়ী কথা বলতেছে— এই তুই গরিবের সন্তান হয়ে আমার বড়লোক চৌধুরী বংশের একমাত্র কন্যার দিকে হাত বাড়াস। তোর কত্ত বড় সাহস। ইয়া ডিশুমাই, ডিশুমাই, ডিশুমাই।

অর্থাৎ গরিবের সাথে বড়লোকের মিল খায় না। মিল খায় গরিবের সাথে গরিবের; না হয় বড়লোকের সাথে বড়লোকের।

স্ট্রিংয়ের ক্ষেত্রেও এমন বড়লোক-ছোটলোক ব্যাপার আছে। একদম বড়লোক-ছোটলোক না হলেও বড় হাতের ইংরেজি অক্ষর আর ছোট হাতের ইংরেজি অক্ষর আছে।

যেমন দেখ, নিচে দুইটা ভেরিয়েবল আছে। একটা ভেরিয়েবলের নাম হচ্ছে subject, আরেকটা ভেরিয়েবলের নাম book, আর এই দুইটার মান একই জিনিস বুঝালেও বানানে হালকা একটু কিন্তু আছে। subject নামক ভেরিয়েবলের মানের মধ্যে 'C' বড় হাতের এবং book নামক ভেরিয়েবলের মানের মধ্যে 'c' ছোট হাতের। এই ছোট হাতের C আর বড় হাতের c কিন্তু সেইম না।

javascript
  const subject = 'Chemistry';
  const book = 'chemistry';

  if (subject === book) {
    console.log('i am reading book');
  } else {
    console.log('hudai prista ultai');
  }

Output: hudai prista ultai

এখানে else-এর অংশটি আউটপুট হিসেবে দেখাবে। কারণ, মান দুইটা সেইম না। সেইম জিনিস কিন্তু বড় হাতের অক্ষর আর ছোট হাতের অক্ষরের জন্য আলাদা আলাদা স্ট্রিং হিসেবে গণ্য করাকে বলে case-sensitive। case-sensitive বলার কারণ হচ্ছে, বড় হাতের অক্ষরগুলাকে বলে upper case, আর ছোট হাতের অক্ষরগুলাকে বলে lower case, আর এই দুইটা আলাদা বুঝানোর জন্য বলে case (upper এবং lower) অর্থাৎ কেইসের সেন্সিটিভ।

দুইটা উদারহণ দিয়ে বিষয়টা ব্যাখ্যা করি—

ইংরেজিতে ছোট হাতের অক্ষরকে যেমন abcd এইগুলাকে lower case অক্ষর বলে, আর বড় হাতের অক্ষর যেমন ABCD এইগুলাকে uppercase অক্ষর বলে। আর কেইস সেন্সিটিভ বলতে বুঝায় abcd আর ABCD এই দুইটা সেইম না। আবার কিছু কিছু ক্ষেত্রে কেইসকে ইগনোরও করতে হয়। তখন abcd আর ABCD দুইটাকে সেইম ধরে নেয়ার দরকার হয়।

যেমন, ই-মেইল এড্রেস বড় হাতের অক্ষর নাকি ছোট হাতের অক্ষর, সেটা মেটার করে না। আবার Dhaka এবং DHAKA একই জায়গা বুঝায়। অন্যদিকে পাসওয়ার্ডের জন্য FoolBanu আর FOOLBANU কিন্তু সেইম পাসওয়ার্ড না; বরং আলাদা আলাদা পাসওয়ার্ড হিসেবে ধরা হয়। অর্থাৎ ই-মেইল এড্রেস কেইস ইগনোর করে অন্যদিকে পাসওয়ার্ড কেইস সেন্সিটিভ।

এখন একটু দেখে নে, কীভাবে খুব সহজেই কোনো স্ট্রিংয়ের সব ক্যারেক্টারকে পুরাপুরি ছোট হাতের অক্ষরে কনভার্ট করে ফেলতে পারবি। জাস্ট স্ট্রিংয়ের নামের পর ডট চিহ্ন দিয়ে তারপর toLowerCase লিখে দুইটা ব্র্যাকেট দিয়ে দিবি। নিচের মতো করে—

javascript
  const name = 'noMAD d MAD';
  const lower = name.toLowerCase();
  console.log(lower);

Output: nomad d mad

একইভাবে কোনো স্ট্রিং সব ক্যারেক্টারকে পুরাপুরি বড় হাতের অক্ষরে কনভার্ট করে ফেলার জন্য স্ট্রিংয়ের নামের পর ডট চিহ্ন দিয়ে তারপর toUpperCase লিখে দুইটা ব্র্যাকেট দিয়ে দিবি। নিচের মতো করে—

javascript
  const name = 'noman d MAN';
  const upper = name.toUpperCase();
  console.log(upper);

Output: NOMAN D MAN

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

javascript
  const subject = 'Chemistry';
  const book = 'chemistry';

  if (subject.toLowerCase() === book.toLowerCase()) {
    console.log('i am reading book');
  } else {
    console.log('hudai prista ultai');
  }

Output: i am reading book

Practice:

  1. একটা ই-মেইল আছে const email = 'User@Example.Com'; এই ই-মেইলকে ছোট হাতের অক্ষরে কনভার্ট কর।
  2. const greeting = 'hELlo WoRLd'; এই স্ট্রিং পুরোটা বড় হাতের অক্ষরে এবং ছোট হাতের অক্ষরে কনভার্ট করে দেখ।
  3. কেইস ইগনোর করে চেক কর const language = 'JavaScript'; এর মধ্যে script আছে কি না।
  4. const text = 'NodeJs'; এই স্ট্রিংয়ের প্রথম ক্যারেক্টার বড় হাতের কি না, তা চেক কর।

14-3: কোপা Split শামসু

String Methods

বাংলাদেশে কোনো জায়গা খালি থাকে না। জায়গা খালি হওয়ার আগেই দখল হয়ে যায়। খাল-বিল-নদী-নালা সব ভরাট হয়ে দখল হয়ে যায়। উঁচা-লম্বা বিল্ডিং হয়ে যায়।

কারণ, খালি জায়গা থাকলে সেটা নিয়ে ঝামেলা শুরু হয়। স্ট্রিংয়ের মধ্যে মাঝেমধ্যে খালি জায়গা থাকলে সেটাও মাঝেমধ্যে ঝামেলা শুরু করে। বিশেষ করে স্ট্রিংয়ের শুরুতে বা শেষের দিকে যদি খালি জায়গা চলে আসে, তাহলে সেটা কিছু ঝামেলা করে ফেলে। অনেক সময়, ইউজার যখন কোনো কিছু লিখে, তখন অনিচ্ছা সত্ত্বেও খালি জায়গা চলে আসতে পারে। তখন স্ট্রিং কম্পেয়ার করা ঠিক হয় না।

javascript
  const drink = '  water';
  const liquid = 'water ';

  if (drink === liquid) {
    console.log('pani hani dami jani');
  } else {
    console.log('somudre pani dekhte valo khaite kalo');
  }

Output: somudre pani dekhte valo khaite kalo

তাই মাঝেমধ্যে স্ট্রিংয়ের শুরুর বা শেষের দিকে বা দুইপাশে খালি স্পেস থাকলে সেটাকে কেটে ফেলতে হয়। ট্রিম করে ফেলার দরকার পড়তে পারে। নিচের মতো করে। জাস্ট স্ট্রিংয়ের পর ডট চিহ্ন দিয়ে trim লিখে দুইটা ব্র্যাকেট দিয়ে দিবি। তাহলে সামনে বা পিছনের, দুই সাইডের খালি জায়গা থাকলে সেটা হাওয়া হয়ে যাবে।

javascript
const drink = "  water";
const liquid = "water ";
console.log(drink.trim());
console.log(liquid.trim());

Output: water;
water;

ট্রিম করে ফেললে তুলনা করা অনেক সহজ হয়ে যায়। শুধু শুধু খালি জায়গার জন্য মেইন জিনিস কম্পেয়ার করতে সমস্যা হয় না।

javascript
  const drink = '  water';
  const liquid = 'water ';

  if (drink.trim() === liquid.trim()) {
    console.log('pani hani dami jani');
  } else {
    console.log('somudre pani dekhte valo khaite kalo');
  }

Output: pani hani dami jani

মাংসের স্লাইস

একটা খাসির বারবিকিউ করা হলো। একটা ফুল খাসি তোকে ডাকলো খাইতে। এখন তুই তো পুরা রান খাইতে পারবি না। তোর দরকার পুরা রানের ভিতর থেকে একটা ছোট স্লাইস। মাঝখান থেকে একটা ছোট স্লাইস দিতে হলে তোকে দুই জায়গায় কোপ মারতে হবে। যেখানে কাটা শুরু হবে। আর কোথায় গিয়ে কাটা শেষ হবে। যেখানে কাটা শুরু হবে, সেখান থেকে যেখানে কাটা শেষ হবে, তার আগ পর্যন্ত মাংসের টুকরা বা স্লাইস তুই পাবি।

একইভাবে কোনো একটা স্ট্রিং থেকে এক টুকরা স্ট্রিং পেতে চাইলে সেই স্ট্রিংয়ের পরে স্লাইস লিখে ব্র্যাকেটের ভিতরে তোকে দুইটা মান দিতে হবে। প্রথমে থাকবে, কোথায় কাটা শুরু হবে। তারপর থাকবে, কোথায় কাটা শেষ হবে। তাহলে এই দুইটা ইনডেক্সের মাঝখানের অংশ তোকে দিয়ে দিবে।

javascript
const address = "andorKilla";
const part = address.slice(2, 5);
console.log(part);

Output: dor;

এখানে, স্ট্রিংয়ের ইনডেক্স 2 থেকে 5-এর আগ পর্যন্ত অংশ কাটা হয়েছে, তাই আউটপুটে 'dor' এসেছে।

তবে তুই যদি স্লাইসের ভিতরে একটা মান দেস, তাহলে যে ইনডেক্সের মান দিছস, সেটা থেকে শুরু করে শেষ পর্যন্ত যতটুকু আছে, সেটা তোকে দিয়ে দিবে।

javascript
const address = "andorKilla";
const part2 = address.slice(5);
console.log(part2);

Output: Killa;

কোপা Split শামসু

তুই খাসির মাংসের একটা টুকরা নিয়ে আসলি সালাদ নিতে। এসে দেখস, শসা কেউ কাটে নাই; বরং অন্যরা তোকে বলতেছে শসা কাটতে। এখন তুই কী করবি। আস্ত একটা শসাকে একটার পর একটা কোপ মারতে মারতে (কোপা শামসুর মতো) অনেকগুলা ছোট ছোট টুকরা বের করস।

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

আলাদা করার মানে হচ্ছে, তুই শব্দগুলোকে আলাদা করে এই শব্দগুলাকে একেকটা উপাদান বানিয়ে সেই শব্দগুলাকে একটা অ্যারের মধ্যে রাখবি।

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

javascript
const sentence = "i am a good and hardworking person";
console.log(sentence.split(" "));

Output: ["i", "am", "a", "good", "and", "hardworking", "person"];

এখানে স্পেস দিয়ে ভাগ করে প্রতিটি শব্দ আলাদা করা হয়েছে।

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

javascript
const friendStr = "Rahim,kahim,dahim,lahim,fahim,sahim";
const friends = friendStr.split(",");
console.log(friends);

Output: ["Rahim", "kahim", "dahim", "lahim", "fahim", "sahim"];

জনি ভাইয়ের join

স্প্লিট দিয়ে আলাদা করবি, join দিয়ে জোড়া লাগাবি।

মাঝেমধ্যে array-এর উপাদানগুলাকে জোড়া দিয়ে দিয়ে একটা স্ট্রিং বানানোর দরকার পড়তে পারে। তখন join ইউজ করা হয়। join করার সময় join লেখার পর ব্র্যাকেটের ভিতরে চাইলে কিছু একটা দেয়া যায়, তাহলে সেটা array-এর সব উপাদানের মাঝে বসে একটা স্ট্রিং হয়ে যাবে।

javascript
const realFriend = ["Rahim", " kahim", " dahim", " lahim", " fahim", " sahim"];
console.log(realFriend.join("|"));

Output: Rahim | kahim | dahim | lahim | fahim | sahim;

বন্ধুত্বের concat বন্ধন

এক বা একধিক স্ট্রিংকে জোড়া দিয়ে একটা স্ট্রিং বানানোর জন্য স্ট্রিংগুলার মাঝখানে প্লাস চিহ্ন দিয়ে জোড়া দেয়া যায়।

javascript
const first = "Abid";
const middle = "Khan";
const last = "Islam";
const name = first + middle + last;
console.log(name);

Output: AbidKhanIslam;

এ ছাড়াও এক বা একাধিক স্ট্রিংকে জোড়া দিয়ে একটা স্ট্রিং বানানোর ভালো সিস্টেম হচ্ছে concat ইউজ করা। জাস্ট কোনো একটা স্ট্রিং বা স্ট্রিং টাইপ ভেরিয়েবলের পর ডট চিহ্ন দিয়ে তারপর concat লিখে সেটার ভিতরে এক বা একাধিক স্ট্রিং দিয়ে দিতে পারবি। যদি একাধিক স্ট্রিং জোড়া লাগাতে চাস, তাহলে concat-এর ভিতরে কমা দিয়ে দিয়ে একাধিক স্ট্রিং দিয়ে দিবি।

javascript
const str1 = "Hello";
const str2 = "World";
const result = str1.concat(" ", str2);
console.log(result);

Output: "Hello World";

const result2 = "I".concat(" love", " JavaScript");
console.log(result2);

Output: "I love JavaScript";

ছোট ভাই substring

কখনো কখনো পুরাটা দরকার নাই। ছোট অংশ দরকার। সেক্ষেত্রে তুই স্ট্রিংকে slice করে নিতে পারবি। স্লাইসের কাছাকাছি আরেকটা জিনিস আছে। যেটাকে substring বলে। sub মানে ছোট। সোজা বাংলায় বললে subString বলতে বুঝায় স্ট্রিংয়ের ছোট একটা অংশ।

javascript
const str = "JavaScript Essentials";
const extractedPart = str.substring(4, 8);

console.log(extractedPart);

Outputs: "Scri";

slice-এর substring দুইটাকে স্ট্রিংয়ের ছোট অংশ কাটার জন্য ইউজ করা যায়। তবে কিছু খুচরা ডিফারেন্স আছে।

Practice:

  1. তোর একগাদা বন্ধুর নাম তোকে একটা স্ট্রিং আকারে দিছে "Raju,Rana,Hasan,Kabir,Mahi"। এদের নামগুলো আলাদা বের করে একটা অ্যারে বানিয়ে ফেল।
  2. তুই একটা অ্যারের মধ্যে তোর বন্ধুদের নাম লিখেছিস। এবার নামগুলো একটা স্ট্রিং আকারে বের করবি, আর প্রতিটা নামের মাঝে কমা(",") থাকবে।
  3. "function if else while" এই স্ট্রিংটাকে স্পেস দিয়ে ভাগ করে প্রতিটা কি-ওয়ার্ড আলাদা করে অ্যারেতে রাখ।
  4. একটি অ্যারে আছে languages=["JavaScript", "Python", "Java"]। এই অ্যারের প্রতিটা ভাষার নামকে একটি স্ট্রিং বানিয়ে প্রতিটার মাঝে সেমিকোলন যোগ কর।
  5. একটি স্ট্রিং দেওয়া আছে "for,while,for-in,for-of,do-while"। এই স্ট্রিং থেকে লুপগুলোর নাম আলাদা করার জন্য split ব্যবহার কর।
  6. একটা স্ট্রিং দেওয়া আছে " console log debug "। এই স্ট্রিং থেকে শুরুর এবং শেষের ফাঁকা জায়গা রিমুভ করে ফেল।
  7. const str1 = "push"; const str2= "pop"; const str3 = "shift"; const str4 = "unshift" এই এই স্ট্রিংগুলাকে জোড়া দিয়ে একটা স্ট্রিং বানিয়ে ফেল। concat ইউজ করে।
  8. "Hello JavaScript Developers" এই স্ট্রিং থেকে "JavaScript" অংশটা বের কর।
  9. একটা স্ট্রিং আছে "Code more learn more"। স্ট্রিংটা থেকে "learn" অংশটা substring দিয়ে বের কর।

14-4: বারে বারে repeat করে যাই

কিছু কিছু পোলাপান আছে, একবার কথা বললে শুনে না। এককথা বারবার বলে তাদের কানে ঢুকাতে হয়। একইভাবে তুই কোনো একটা string-এর ওপরে repeat ইউজ করে তারপরে ব্র্যাকেটের ভিতরে কোনো সংখ্যা দিয়ে সেই স্ট্রিংকে বারবার রিপিট করতে পারবি।

javascript
  const str = "Hello!";
  const repeatedStr = str.repeat(3);
  console.log(repeatedStr);

Output: Hello!Hello!Hello!

এই উদাহরণে, "Hello!" স্ট্রিংটি ৩ বার রিপিট করে "Hello!Hello!Hello!" আউটপুট দিছে।

ধরে ধরে স্ট্রিং বানা

মাঝেমধ্যে ডিফারেন্ট টাইপের জিনিসকে স্ট্রিংয়ে রূপান্তর করার দরকার পড়ে, তখন toString খুব কাজে লাগে। বিশেষ করে সংখ্যা, তারিখ, অ্যারে, এমনকি নিজের ইচ্ছামতো ফাংশন লিখে অবজেক্টকে স্ট্রিংয়ে কনভার্ট করতে পারবি।

javascript
const num = 123;
const str = num.toString();
console.log(str);

Output: "123";

পাল্টে ফেল

ক্রিকেট টিমের মধ্যে দেখা যায়, একজন বোলার চেইঞ্জ হয়ে যায়, তার জায়গায় আরেকজন আসে, সে বোলিং করে। স্ট্রিংয়ের মধ্যেও মাঝেমধ্যে কিছু অংশ চেইঞ্জ করে ফেলার দরকার পড়ে। রিপ্লেস বা পাল্টে ফেলার জন্য দুইটা জিনিস লাগবে। প্রথম লাগবে, কাকে রিপ্লেস করবি। তারপর, সেখানে কে বসবে।

কোনো স্ট্রিংয়ের ছোট কোনো অংশকে যদি রিপ্লেস করতে চাস, তাহলে স্টিংয়ের পর replace লিখবি। তারপর ব্র্যাকেটের ভিতরে প্রথমে লিখবি, কাকে রিপ্লেস করবি। তারপর কমা দিয়ে লিখবি, রিপ্লেস করে কী বসবে, তাহলেই হবে।

javascript
  const text = "I love programming. programming is fun!";
  const result = text.replace("programming", "coding");
  console.log(result);

Output: I love coding. programming is fun!

এখানে, replace() শুধু প্রথম ম্যাচিং পাওয়া "programming" শব্দটাকে "coding" দিয়ে পরিবর্তন করছে। যদি কখনো দরকার পড়বে যে, যত জায়গায় আছে, সব জায়গায় চেইঞ্জ করতে চাস, তাহলে সেইম স্টাইলে replace-এর পরিবর্তে replaceAll() ব্যবহার করবি।

javascript
  const text = "I love programming. programming is fun!";
  const result = text.replaceAll("programming", "coding");
  console.log(result);

Output: I love coding. coding is fun!

Practice:

  1. একটি string তৈরি কর, যার ভ্যালু হবে "Hi"। সেটি repeat দিয়ে 10 বার রিপিট করে কনসোল লগ কর।
  2. একটি স্ট্রিং বানা "I am learning JavaScript. JavaScript is amazing!"। replace ব্যবহার করে প্রথম "JavaScript"-কে "JS" দিয়ে রিপ্লেস কর।
  3. একটি স্ট্রিং বানা "I love apples and apples are tasty!". সব "apples"-কে "mangoes" দিয়ে রিপ্লেস কর।

14-5: মাথা উল্টা reverse স্ট্রিং

গাড়ি বা মোটর সাইকেল সব সময় যে সামনের দিকে চলে, এইটা কিন্তু না। মাঝেমধ্যে খাদে পড়ে গেলে তোকে রিভার্স বা পিছনের দিকে নিতে হয়। ওই গর্ত বা চিপা থেকে পিছনের দিকে যেতে হয়। একইভাবে স্ট্রিংও মাঝেমধ্যে উল্টা দিকে নিতে হয় বা নেয়ার সিস্টেমটা কী, সেটা জানার দরকার পড়তে পারে।

রিভার্স মানে হচ্ছে, কোনো একটা word বা sentence-কে উল্টাই দে। মানে ধর, তোর নাম rakeb, এটাকে যদি রিভার্স করি, তাহলে দাঁড়াচ্ছে bekar বা stressed-কে উল্টালে মিষ্টি জাতীয় খাবার desserts হয়ে যায়, অথবা flow-কে রিভার্স করলে wolf হয় ইত্যাদি।

javascript
const sentence = "I am learning Web Dev";

তো এটাকে আমরা reverse করতে চাচ্ছি। এটা আমরা কীভাবে করব? আমরা এটা জানি যে, এটা একটা string, এটাতে index থাকে, এটা অনেকটা array-এর মতো। আমরা এটা করার জন্য loop করতে পারি, যা আমরা কিছুটা শিখেছিলাম।

javascript
const sentence = "I am learning Web Dev";
for (const letter of sentence) {
  console.log(letter);
}

এই loopটা রান করলে কী হয়, সেটা আমরা অলরেডি জানি, তবু এটার আউটপুটটা দেখি।

javascript
Output: I;

a;
m;

l;
e;
a;
r;
n;
i;
n;
g;

W;
e;
b;

D;
e;
v;

Loop ভেরিয়েবলটা হচ্ছে letter এবং এই letter sentence ভেরিয়েবলে প্রতিটা লেটার আসতেছে, আর আমরা সেটাকে প্রিন্ট করতেছি। এটার মাধ্যমে আমরা sentence-এর প্রতিটা লেটারকে আলাদা আলাদা করে পেয়েছি। আর এটাকে কাজে লাগিয়ে আমরা একটু কষ্ট হলেও reverse করতে পারব। এটা করার জন্য প্রথমেই আমরা একটা empty string ডিক্লেয়ার করে নিব। string কেন ডিক্লেয়ার করব? কারণ, reverse করা string তো কোথাও store করে রাখতে হবে, তাই না? তাই এটার জন্য আমরা একটা string ডিক্লেয়ার করে নেব। তারপর লুপের ভিতরে একটা কিছু করবি। কী করবি, সেটা নিচে দেখ।

javascript
const sentence = "I am learning Web Dev";
let reverse = "";
for (const letter of sentence) {
  reverse = letter + reverse;
}

আরে আরে, আরে ভাই! এটা কী করলি? reverse = letter + reverse; কেন করলি এটা? letter ভেরিয়েবলে আমরা প্রতিটা ক্যারেক্টারকে আলাদা করে পাচ্ছি, এটা ঠিক তাই না?

এখন আমাদের স্ট্রিংয়ে Web এই ওয়ার্ডটাকে উদাহরণ হিসেবে চিন্তা করা যাক। আমরা কী করলাম? reverse নামের একটা empty string নিলাম এবং সেখানে প্রতিবার letter ভেরিয়েবলের মান তার পূর্ববর্তী reverse ভেরিয়েবলের মানের সাথে যোগ করে আবার সেটা reverse স্টোর করছে। জিনিসটা একটু ভেঙে দেখ।

javascript
1st loop → reverse = ''
	    letter = 'W'
	    reverse = letter + ''
	    reverse = W + ''

তারমানে প্রথমবার যখন loop চলে, তখন reverse ভেরিয়েবলের মধ্যে শুধু Web-এর W লেটারটা যোগ হয়। এখন reverse ভেরিয়েবলের মধ্যে শুধু W রয়েছে।

javascript
2nd loop → reverse = 'W'
	    letter = 'e'
	    reverse = letter + 'W'
	    reverse = 'e' + 'W'

এখন letter ভেরিয়েবলের মধ্যে Web-এর e রয়েছে, যা পুরাতন reverse-এর আগে যোগ হয়ে eW আবার reverse স্টোর হচ্ছে।

Similarly,

javascript
3rd loop → reverse = 'eW'
	    letter = 'b'
	    reverse = letter + reverse
	    reverse = b + eW

এখন রিভার্সের মধ্যে Web ওয়ার্ডটা উল্টোভাবে store হয়েছে। এভাবে করে যদি পুরো sentence-এর জন্য loop চলে, তাহলেই আমাদের কাজ সম্পন্ন হয়ে যাবে।

javascript
  const sentence = 'I am learning Web Dev';
  let reverse = '';
  for(const letter of sentence)
  {
	reverse = letter + reverse;
  }
  console.log(reverse);

Output:
veD beW gninrael ma I

এখন পুরোপুরি আমাদের sentenceটা রিভার্স হয়ে গেছে। রিভার্স করার একটা সিস্টেম তুই অলরেডি শিখে ফেলেছিস।

Released under the MIT License.