8.11. Maps (ম্যাপ) এবং Sets (সেট)

 

Maps (ম্যাপ)

ম্যাপ হচ্ছে key-value pair এর একটা কালেকশন। অবজেক্টে key স্ট্রিংয়ে চেঞ্জ হয়ে গেলেও ম্যাপে সেটা হয় না, তাই ম্যাপে যেকোনো টাইপের key ব্যবহার করা যায়। ম্যাপ তার ইলিমেন্ট গুলো অ্যাড করার অর্ডার মনে রাখে, ফলে যেই সিকোয়েন্সে ডাটা অ্যাড করা হয়েছিল, সেভাবেই ডাটাগুলো পুনরায় পাওয়া যাবে। 

ম্যাপে ভ্যালু অ্যাড করার জন্য set method ব্যবহার করা হয়। এর প্যারামিটার দুটো – key, value। একটা লক্ষণীয় বিষয় হচ্ছে একই key দিয়ে একাধিক value অ্যাড করা হলে পরেরটা সবসময় আগেরটাকে replace করবে। ম্যাপ থেকে ভ্যালু পাওয়ার জন্য get method ব্যবহার করা হয়।

ম্যাপের কিছু বিল্ট-ইন প্রোপার্টি আর মেথড আছে –

  • size property দিয়ে ম্যাপের এলিমেন্ট সংখ্যা জানা যায়
  • has method দিয়ে একটা key খোঁজা যায়
  • delete method দিয়ে একটা key remove করা যায়
  • clear method দিয়ে ম্যাপ থেকে সব অবজেক্ট একবারে remove করা যায়।

 keys(), values() and entries() methods গুলো একটা MapIterator রিটার্ন করে যা দিয়ে সহজেই for..of লুপ চালিয়ে ম্যাপকে ইটারেট করা যায়। একটা অবজেক্টকে নিচের উদাহরণের মতো ম্যাপে convert করা যায়

const address = {
  'Tapas': 'Bangalore',
  'James': 'Huston',
  'Selva': 'Srilanka'
};
const addressMap = new Map(Object.entries(address));

একটা ম্যাপকে অবজেক্টে এভাবে convert করা যায় –

const object = Object.fromEntries(map)

একটা ম্যাপকে দুই ভাবে অ্যারেতে convert করা যায় –

const map = new Map();
map.set('milk', 200);
map.set("tea", 300);
map.set('coffee', 500);

console.log(Array.from(map));  
console.log([...map]);

 

Sets (সেট)

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

সেটের কিছু বিল্ট-ইন প্রোপার্টি আর মেথড আছে –

  • size property দিয়ে সেটের এলিমেন্ট সংখ্যা জানা যায়
  • add method দিয়ে একটা element অ্যাড করা যায়
  • has method দিয়ে একটা element খোঁজা যায়
  • delete method দিয়ে একটা element remove করা যায়
  • clear method দিয়ে সেট থেকে সব element একবারে remove করা যায়।

সেটের values() method একটা SetIterator returns করে যা দিয়ে for…of লুপের মাধ্যমে  এর value গুলো পাওয়া যায়

একটা সেটকে এভাবে অ্যারেতে convert করা যায় –

const arr = [...set];

 

WeakMaps and WeakSets:

এদের সম্পর্কে বলার আগে আমাদেরকে জানতে হবে strong reference আর weak reference সম্পর্কে। সহজ ভাবে বলা যায় যে strong reference হচ্ছে সেই reference যেটা মেমরিতে অবজেক্ট স্টোর করে।

let dog = { name: "badger" };
const pets = [dog];
dog = null;

console.log(pets); 	// [{ name: "badger" }]

উদাহরণে আমরা অবজেক্টটির ভ্যালু null সেট করে দেওয়ার পরও অ্যারেতে অবজেক্টটি পাচ্ছি। যদিও আমরা অবজেক্টটিকে আগের নামে পাচ্ছি না, কিন্তু মেমরিতে অবজেক্টটি থাকার কারণে অ্যারে থেকে অবজেক্টটি অ্যাক্সেস করা যাচ্ছে। অন্যভাবে বুলা যায় strong reference garbage collection দ্বারা মেমরি থেকে অবজেক্টটি রিমুভ করতে বাধা দেয়। অন্য দিকে weak reference হলো সেই reference যেটা ওভাবে বাধা দেয় না যদি মেমরিতে কেবলমাত্র অবজেক্টটির reference থাকে।

et pets = new WeakMap();
let dog = { name: "badger" };
pets.set(dog, "save");
console.log(pets);	 // WeakMap{ {...} -> "save" } 

dog = null; 		 // Overwrite the reference to the object
console.log(pets); 	 // WeakMap(0)

সাধারণত জাভাস্ক্রিপ্ট যে কোনো reference এর জন্য strong references ব্যবহার করে ,আর কেবল WeakMap বা  WeakSet এর জন্য weak references ব্যবহার করে। set এর মতো weaksetও একটা কালেকশন যা ইউনিক অবজেক্ট স্টোর করে। পার্থক্য হচ্ছে weakset অবজেক্ট ছাড়া অন্য কোনো টাইপের arbitrary value স্টোর করতে পারে না। weak references এর কারণে WeakSet enumerable নয়। মানে এর আইটেম গুলোকে লুপ চালিয়ে বের করা যাবে না কারণ সেগুলো weak referenced।

একই ভাবে map আর weakmap ও সেইম, জাস্ট পার্থক্য হচ্ছে weakmap যেই references রাখে সেগুলো weak references, মানে এগুলো অন্য কোথাও strongly referenced না হলে garbage collection কে আটকাবে না ঐ ভ্যালু গুলোকে রিমুভ করতে। weakset এর মতো একই ভাবে weakmap এর আইটেম গুলোকে লুপ চালিয়ে বের করা যাবে না কারণ সেগুলো weak referenced আর keys হিসেবে একই ভাবে অবজেক্ট ব্যবহার করত হবে, যদিও values হিসেবে arbitrary value ব্যবহার করা যাবে।