‘Map’ অবজেক্ট
এই প্রবন্ধে ‘Map’ অবজেক্ট নিয়ে আলোচনা করা হয়েছে।
আমরা ধাপে ধাপে ব্যাখ্যা করব, মৌলিক অপারেশন থেকে শুরু করে বাস্তব পরিস্থিতিতে কার্যকর উদাহরণ পর্যন্ত।
YouTube Video
‘Map’ অবজেক্ট
‘Map’ হল একটি সংগ্রহ যা কী-ভ্যালু জোড়া সংরক্ষণ করে। এটি একটি অবজেক্টের মতো, তবে পার্থক্য হলো এখানে অবজেক্ট, ফাংশন বা প্রিমিটিভ সহ যেকোনো টাইপের মান কী হিসেবে ব্যবহার করা যায় এবং ইনসার্শনের ক্রম সংরক্ষিত থাকে।
‘Map’-এর মৌলিক বিষয়সমূহ
প্রথমে, চলুন দেখি কিভাবে একটি ‘Map’ তৈরি করা যায় এবং মৌলিক অপারেশন করা যায়।
নিম্নের কোডটি একটি ক্ষুদ্র উদাহরণ যা একটি খালি ম্যাপ তৈরি করে, কী যোগ করে এবং মান রিট্রিভ করে।
1// Create an empty Map and add key-value pairs
2const m = new Map();
3m.set('a', 1);
4m.set('b', 2);
5
6console.log(m.get('a')); // 1
7console.log(m.size); // 2
- এই কোডে, আপনি ‘set’ দিয়ে উপাদান যোগ করতে, ‘get’ দিয়ে মান বের করতে, এবং ‘size’ দিয়ে উপাদান সংখ্যা দেখতে পারেন।
- ‘Map’ ইনসার্ট করার ক্রম সংরক্ষণ করে, যা ক্রম-নির্ভর প্রসেসিংয়ের জন্য উপযোগী।
‘set’, ‘get’, ‘has’ এবং ‘delete’-এর আচরণ
এখানে পড়া, লেখা, বিদ্যমানতা যাচাই, এবং ডিলিট-অপারেশনের উদাহরণ দেওয়া হলো।
নিম্নের কোড দ্বারা, আপনি প্রতিটি মেথডের রিটার্ন ভ্যালু ও ফলাফল পরীক্ষা করতে পারেন।
1// Demonstrate set, get, has, and delete
2const m2 = new Map();
3m2.set('x', 10);
4console.log(m2.has('x')); // true
5console.log(m2.get('y')); // undefined
6
7m2.delete('x');
8console.log(m2.has('x')); // false
9
10// set returns the map itself, allowing method chaining
11m2.set('a', 1).set('b', 2);
12console.log(m2); // Map { 'a' => 1, 'b' => 2 }
- যদি কী না থাকে, ‘get’
undefinedরিটার্ন করে।hasএকটি কী বিদ্যমান আছে কিনা তা যাচাই করে, এবংdeleteএকটি কী সরিয়ে দেয়। - এছাড়াও, ‘set’ নিজেই map রিটার্ন করে বলে মেথড চেইনিং সম্ভব।
যেকোনো ধরনের মান কী হিসাবে ব্যবহার করা যায় (অবজেক্ট কী হিসেবে ব্যবহার)
Map-এর প্রধান সুবিধাগুলোর একটি হলো, আপনি অবজেক্ট সরাসরি কী হিসেবে ব্যবহার করতে পারেন।
নিম্নের উদাহরণে দেখানো হয়েছে কীভাবে অবজেক্টকে কী হিসেবে ব্যবহার করে Map-এ মান অ্যাসোসিয়েট করা যায়।
1// Use objects as keys in a Map
2const keyObj = { id: 1 };
3const keyFunc = () => {};
4const objMap = new Map();
5
6// Another object with the same content but a different reference
7const anotherKeyObj = { id: 1 };
8
9objMap.set(keyObj, 'objectValue');
10objMap.set(keyFunc, 'functionValue');
11objMap.set(anotherKeyObj, 'anotherValue');
12
13console.log(objMap.get(keyObj)); // 'objectValue'
14console.log(objMap.get(keyFunc)); // 'functionValue'
15console.log(objMap.get(anotherKeyObj)); // 'anotherValue'
- অবজেক্টকে কী হিসেবে ব্যবহার করলে, একই রেফারেন্স থাকা আবশ্যক। তাদের কনটেন্ট একই হলেও, আলাদা রেফারেন্স থাকলে সেগুলোর কী আলাদা গণ্য হয়।
ইটারেশন (লুপিং)
‘Map’ ইনসার্ট করার ক্রম রাখে বলে ইটারেশন প্রায়ই ব্যবহৃত হয়।
নিম্নে, আমরা দেখিয়েছি কীভাবে ‘for...of’, ‘forEach’, এবং ‘keys()’, ‘values()’, ‘entries()’ মেথড ব্যবহার করা যায়।
1// Iterating a Map with for...of and forEach
2const iterMap = new Map([['a', 1], ['b', 2], ['c', 3]]);
3
4// for...of over entries (default)
5for (const [key, value] of iterMap) {
6 console.log(key, value);
7}
8
9// forEach callback
10iterMap.forEach((value, key) => {
11 console.log(key, value);
12});
13
14// keys() and values()
15console.log([...iterMap.keys()]); // ['a','b','c']
16console.log([...iterMap.values()]); // [1,2,3]
- ‘entries()’
[key, value]জোড়ার অ্যারে রিটার্ন করে, যেটি স্প্রেড সিনট্যাক্স দিয়ে অ্যারে বানানো যায়। খেয়াল রাখুন, ‘forEach’-এর কলব্যাক ‘value, key’ -এর ক্রমে আর্গুমেন্ট নেয়।
Map এবং Object-এর মধ্যে কনভার্সন
আপনি একটি বিদ্যমান অবজেক্টকে Map-এ বা Map-কে সাধারণ অবজেক্ট বা অ্যারেতে কনভার্ট করতে পারেন।
1// Convert between Map and Object / Array
2const obj = { a: 1, b: 2 };
3const mapFromObj = new Map(Object.entries(obj)); // Object -> Map
4console.log(mapFromObj.get('a')); // 1
5
6const objFromMap = Object.fromEntries(mapFromObj); // Map -> Object
7console.log(objFromMap); // { a: 1, b: 2 }
8
9const arrayFromMap = [...mapFromObj]; // Map -> Array of [key, value]
10console.log(arrayFromMap); // [['a',1], ['b',2]]
- ‘Object.entries’ এবং ‘Object.fromEntries’ ব্যবহার করলে কনভার্সন সহজ হয়। তবে, অবজেক্টের কী শুধুমাত্র স্ট্রিং বা সিম্বল হয়, ফলে ফেরত কনভার্ট করলে নন-স্ট্রিং কী গুলো হারিয়ে যায়।
প্রয়োগিক প্যাটার্ন: ফ্রিকোয়েন্সি কাউন্টিং (কাউন্ট ম্যাপ)
একটি অ্যারেতে উপাদানের ফ্রিকোয়েন্সি গুনতে, Map ব্যবহার করলে প্রক্রিয়াটি আরও সহজ হয়ে যায়।
নিম্নের কোডে দেখানো হয়েছে কিভাবে একটি অ্যারের স্ট্রিং এর সংখ্যা গননা ও সাজানো যায়।
1// Count frequencies with Map
2const arr = ['apple','banana','apple','orange','banana','apple'];
3const freq = new Map();
4
5for (const item of arr) {
6 freq.set(item, (freq.get(item) || 0) + 1);
7}
8
9console.log([...freq.entries()]); // [['apple',3], ['banana',2], ['orange',1]]
- ‘Map’ ব্যবহার করলে সহজে বিদ্যমানতা যাচাই ও আপডেট করা যায়। অবজেক্ট দিয়েও এটা করা যায়, তবে অ্যারবিট্রারি কী-এর জন্য ‘Map’ বেশি স্বচ্ছভাবে কাজ করে।
Map এবং JSON.stringify (সিরিয়ালাইজেশন) নিয়ে নোট
‘JSON.stringify’ সরাসরি একটি ‘Map’ সিরিয়ালাইজ করতে পারে না। যদি আপনাকে Map সংরক্ষণ করতে হয়, প্রথমে আপনি সেটি কনভার্ট করতে হবে।
নিম্নের উদাহরণে দেখানো হয়েছে কিভাবে Map-কে অ্যারেতে কনভার্ট করে JSON বানানো যায় এবং কিভাবে পুনরুদ্ধার করা যায়।
1// Serialize and deserialize a Map
2const m3 = new Map([['x', 1], ['y', 2]]);
3const json = JSON.stringify([...m3]); // convert to array first
4console.log(json); // '[["x",1],["y",2]]'
5
6const restored = new Map(JSON.parse(json));
7console.log(restored.get('x')); // 1
- যেসব Map সংরক্ষণ বা পাঠানো দরকার, সেগুলো সিরিয়ালাইজ করার আগে অ্যারেতে কনভার্ট করা উচিত। পুনরুদ্ধার করার সময় ‘JSON.parse’ ব্যবহার করে অ্যারেতে কনভার্ট করুন, তারপর পুনরায় সেটি Map-এ রূপান্তর করুন।
WeakMap পরিচিতি এবং ব্যবহারের উপায়
‘WeakMap’-এর বিশেষত্ব হল এতে কী গুলো দুর্বলভাবে রেফারেন্স করা হয় (গার্বেজ কালেকশনের আওতায় পড়ে)।
অবজেক্টকে কী হিসেবে নিয়ে ক্যাশ বা মেটাডেটা ধারণ করার জন্য এটি উপযোগী, কারণ কী অবজেক্ট গার্বেজ কালেক্ট হলে এগুলো স্বয়ংক্রিয়ভাবে মুক্ত হয়।
1// WeakMap for metadata tied to object lifecycle
2const wm = new WeakMap();
3let obj = {};
4wm.set(obj, { meta: 'info' });
5console.log(wm.get(obj)); // { meta: 'info' }
6
7obj = null; // now the object can be GC'd and its entry removed from WeakMap
WeakMapকে ইটারেট কিংবা সাইজ চেক করা যায় না, তবে মেমরি লিক রোধ করতে এটি ব্যবহারযোগ্য।
সারসংক্ষেপ
‘Map’ একটি সহজ সংগ্রহ, যা অবজেক্টের মত নয়; এখানে যেকোনো টাইপ কী হিসেবে দেয়া যায় এবং ইনসার্ট করার ক্রম থাকে। মৌলিক অপারেশন থেকে উন্নত ব্যবহারের সবকিছু বুঝে আপনি আরও নমনীয় ও স্বচ্ছভাবে ডেটা ম্যানেজ করতে পারবেন। ব্যবহারের উপযোগিতা অনুযায়ী ‘Object’ ও ‘Map’ যথাযথভাবে ব্যবহার করলে কোডের স্বচ্ছতা ও পাঠযোগ্যতা অনেক বাড়বে।
আপনি আমাদের ইউটিউব চ্যানেলে ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করে উপরের নিবন্ধটি অনুসরণ করতে পারেন। দয়া করে ইউটিউব চ্যানেলটিও দেখুন।