জাভাস্ক্রিপ্ট টিউটোরিয়াল-শিখুন গল্পে গল্পে সাথে 1100+ Exercise

  • জাভাস্ক্রিপ্ট পরিচিতি-Introduction to JavaScript
  • প্রোগ্রামিং শুরু করতে কতটুকু গণিত লাগে?
  • প্রোগ্রামিং শুরু করতে কতটুকু ইংরেজি জানা লাগে?
  • ভালো প্রোগ্রামার কিভাবে হবো? [+৭টি গুরুত্বপূর্ণ টিপস]
  • map কইরা দেন ভাই
  • every লিটনের some flat
  • Reduce করে একটা করে দাও (advanced)
  • চট করে Sort কর
  • উল্টাপথের reverse
  • নাইস নাইস slice splice

চট করে Sort কর


Uploaded Image


যদি ফুঁ দিলে ভদ্রলোক হয়ে যাওয়া যেত, তাহলে সবাই ভদ্রলোক হয়ে থাকত। আবার ফুঁ দিলে যদি অগুছালো বাসাবাড়ি গুছানো হয়ে যেত, তাহলে সবার পড়ার টেবিল, জামা-কাপড়, বিছানা, চৌকির তলা— সব পারফেক্টভাবে গুছানো থাকত। 


যদিও ফুঁ দিলে গুছানো হবে, এইটা অনেকেই আশা করতে পারে না। তবে জাভাস্ক্রিপ্টে ফুঁ দিলে অনেক কিছু সাজানো-গুছানো হয়ে যেতে পারে।


এই ফুঁ দেয়ার জন্য জাস্ট একটা অ্যারের নামের পর একটা ডট চিহ্ন(.) দিয়ে তারপর sort লিখে এরপর দুইটা ব্র্যাকেট দিয়ে ফেলবি। নিচের মতো। তাহলেই অনেক সময় কাজ হয়ে যাবে। 


ধর, তোর কাছে বন্ধুর নামের একটা তালিকা আছে। এখন তুই চাইতেছিস নামগুলারে alphabetically সাজাতে।


  const friends = ['Zara', 'Bob', 'Anna', 'Chris'];
  friends.sort();
  console.log(friends);

Output:[ 'Anna', 'Bob', 'Chris', 'Zara' ]


চমৎকারভাবে নামগুলো alphabetically সাজানো হয়ে গেল।


  const numbers = [3, 5, 4, 2, 7, 1, 6, 9];
  numbers.sort();
  console.log(numbers);

Output: [1, 2, 3, 4, 5, 6, 7, 9]


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


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


  const numbers = [30, 5, 100, 12];
  numbers.sort();
  console.log(numbers);

Output: [ 100, 12, 30, 5 ]


দেখলি? এটা ঠিকমতো কাজ করল না। কারণ, এটা string হিসেবে ধরে সাজাইছে। স্ট্রিং হিসেবে সাজায় বলতে বুঝায়, তুই যদি litu, asif, jamal, abidur, borhan-কে সাজাতে চাস।  


  const names = ['litu', 'asif', 'jamal', 'abidur', 'borhan'];
  names.sort();
  console.log(names); 

Output: ['abidur', 'asif', 'borhan', 'jamal', 'litu']


কারণ, তুই নামের প্রথম অক্ষর দিয়ে তুলনা করতে করতে যাবি। অর্থাৎ যদি litu নামটা ছোটও হয়, তাহলেও সে পরে থাকবে, আর abidur-এর নাম বড় হলেও সে যেহেতু a দিয়ে শুরু হয়েছে, সেটা আগে চলে আসবে। আবার ইংরেজি অক্ষরের মধ্যে b আগে আর j পরে। তাই সিরিয়ালে jamal-এর আগে borhan চলে যাবে। 


এইটা তো বুজছস?


দুঃখজনকভাবে জাভাস্ক্রিপ্ট সংখ্যার তুলনা পুরা সংখ্যা দিয়ে না করে প্রথম অঙ্ক দিয়ে করে। সেজন্য সে 30 যেহেতু 3 দিয়ে শুরু হয়েছে, সে 30-কে 5-এর আগে রাখবে। একইভাবে 100 যেহেতু 1 দিয়ে শুরু হইছে, তাই 100-কে 30-এর আগে রাখবে। কী অদ্ভুত, তাই না?


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


এই কলব্যাক ফাংশনকে বলে compare function। কারণ, এইটা দিয়ে অ্যারের উপাদানগুলোকে তুলনা করে বা কম্পেয়ার করে।


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


  (a, b) ⇒ a - b 


sort-এর ভিতরে এই সিম্পল ফাংশনটা লিখলেই সংখ্যার মান অনুসারে সাজানোর কাজটা হয়ে যাবে। 


  const numbers = [30, 5, 100, 12];
  numbers.sort((a, b) => a - b);
  console.log(numbers);

Output: [ 5, 12, 30, 100 ]


এইবার compare function-এর ভিতরের কাহিনি এক্সপ্লেইন করি। এই কম্পেয়ার ফাংশন, অ্যারে থেকে দুইটা করে উপাদান নিয়ে তুলনা করবে। অর্থাৎ (a, b) ⇒ a - b সে আসলে অ্যারের দুইটা উপাদান নিয়ে তুলনা করে। আর পুরা সংখ্যা নিয়ে তুলনা করতে গেলে তিনটা জিনিস হতে পারে। 


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

আবার হতে পারে a - b-এর মান নেগেটিভ সংখ্যা। নেগেটিভ মানে হচ্ছে a ছোট আর b বড়, তাই a - b নেগেটিভ। আর এমনটা হলে সে অ্যারের মধ্যে a-কে আগে নিয়ে যাবে, আর b-কে পরে নিয়ে যাবে।

আরেকটা জিনিস হতে পারে, a - b-এর মান শূন্য। অর্থাৎ a আর b দুইটার মানই সেইম। অর্থাৎ a - b-এর মধ্যে ডিফারেন্স নাই। তখন সে a-এর জায়গায় a-কে রেখে দিবে। সরাবে না। একইভাবে b-এর জায়গায় b-কে রেখে দিবে। জায়গা চেইঞ্জ করবে না। 



সংখ্যা সাজানো (Descending Order)

এই কম্পেয়ার ফাংশনটা অনেক কাজে লাগে। a - b দিলে সে সংখ্যাগুলোকে ছোট থেকে বড় আকারে অর্থাৎ Ascending order-এ সাজাবে। আবার এই কম্পেয়ার ফাংশন ইউজ করে তুই চাইলে ডিসেন্ডিং অর্ডারে (Descending order) সাজাতে পারবি। অর্থাৎ বড় থেকে ছোট ক্রমানুসারে সাজাতে গেলে ইচ্ছা করে কম্পেয়ার ফাংশনের ভিতরে a - b না দিয়ে b - a দিয়ে দিবি। তাহলে সে পজিটিভ হলে বড় সংখ্যাটাকে আগে রাখবে, আর ছোটটাকে পিছনে রাখবে। অর্থাৎ Ascending-এর উল্টাভাবে কাজ করবে। 


  const numbers = [30, 5, 100, 12];
  numbers.sort((a, b) => b - a);
  console.log(numbers);

Output: [ 100, 30, 12, 5 ]


অ্যাডভান্সড ব্যবহার : Objects সাজানো

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


  const friends = [
   { name: 'Zara', age: 25 },
   { name: 'Bob', age: 20 },
   { name: 'Anna', age: 30 }
  ];

  friends.sort((a, b) => a.age - b.age);
  console.log(friends);

Output:
[
 { name: 'Bob', age: 20 },
 { name: 'Zara', age: 25 },
 { name: 'Anna', age: 30 }
]


এইভাবে sort দিয়ে খুব সহজেই (বা একটু কষ্ট করে কম্পেয়ার ফাংশন দিয়ে) তুই সাজিয়ে ফেলতে পারবি তোর ছোট্ট সুখের জাভাস্ক্রিপ্টের ঘর। 


Practice: 

  1. অ্যারেটাকে ছোট থেকে বড় সাজিয়ে দে: const numbers = [50, 12, 25, 8, 15];
  2. একটা array numbers = [13, 2, 45, 9, 6]; ব্যবহার করে descending order-এ sort কর।
  3. বন্ধুদের age অনুসারে sorting করে দেখা const friends = [{name: 'Ali', age: 29}, {name: 'Sara', age: 22}, {name: 'Tariq', age: 35}];
  4. একটা নামের array দিয়ে প্রতিটি নামকে alphabetically সাজিয়ে দেখাও: const names = ['nabil', 'zubayer', 'sarwar', 'delwar'];


Previous PageNext Page