ES6 এ Iterators এবং Iterables দুটি গুরুত্বপূর্ণ কনসেপ্ট যুক্ত করা হয়েছে যা কাস্টম ইটারেশন, ডেটা সংকলন এবং লুপিং এর জন্য নতুন ক্ষমতা প্রদান করে। এই দুটি কনসেপ্ট একসাথে ব্যবহৃত হলে আপনি আরও শক্তিশালী এবং নমনীয় ডেটা স্ট্রাকচার তৈরি করতে পারেন, যেগুলি ইটারেশন (iteration) সমর্থন করে।
1. Iterables কী?
একটি Iterable এমন কোনো অবজেক্ট যা ইটারেশন সমর্থন করে এবং যা Symbol.iterator প্রপার্টি দিয়ে শনাক্ত করা যায়। এই প্রপার্টিটি একটি ফাংশন রিটার্ন করে, যেটি ইটারেটর অবজেক্ট প্রদান করে। অর্থাৎ, ইটারেবল অবজেক্ট হতে হবে এমন একটি অবজেক্ট যা for...of লুপ বা অন্যান্য ইটারেশন কৌশল দ্বারা একের পর এক উপাদান প্রদর্শন করতে সক্ষম।
উদাহরণ:
const array = [1, 2, 3];
console.log(array[Symbol.iterator]); // function values() { [native code] }
এখানে, array একটি ইটারেবল অবজেক্ট যেহেতু এটি Symbol.iterator প্রপার্টি পায়।
2. Iterators কী?
Iterator এমন একটি অবজেক্ট যা একটি ইটারেবল অবজেক্টের উপাদান একের পর এক ফেরত দেয়। এটি next() মেথডের মাধ্যমে কাজ করে, যা একটি {value, done} অবজেক্ট রিটার্ন করে। এখানে value হলো বর্তমান উপাদান এবং done হলো একটি বুলিয়ান মান যা ইটারেশন শেষ হওয়ার ইঙ্গিত দেয়।
ইটারেটর এর গঠন:
value: বর্তমান উপাদান বা মান।done: একটি বুলিয়ান মান, যা ইটারেশন শেষ হলেtrueহয়, অন্যথায়false।
উদাহরণ:
const array = [1, 2, 3];
const iterator = array[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
এখানে, array একটি ইটারেবল অবজেক্ট এবং iterator হলো এর ইটারেটর। next() মেথডের মাধ্যমে আমরা একে একে value এবং done পাচ্ছি।
3. for...of লুপে Iterables ব্যবহার
for...of লুপ ইটারেবল অবজেক্টের উপর ইটারেশন চালাতে ব্যবহৃত হয়। এটি স্বয়ংক্রিয়ভাবে ইটারেটরের next() মেথডকে কল করে এবং প্রতিটি উপাদানকে অ্যাক্সেস করতে সক্ষম হয়।
উদাহরণ:
const array = [1, 2, 3];
for (let value of array) {
console.log(value); // 1, 2, 3
}
এখানে, for...of লুপ array এর প্রতিটি উপাদান ইটারেটরের মাধ্যমে বের করে এবং প্রদর্শন করে।
4. Custom Iterable Objects (কাস্টম ইটারেবল অবজেক্ট তৈরি করা)
ES6 আপনাকে ইটারেবল অবজেক্ট তৈরি করার অনুমতি দেয়। অর্থাৎ, আপনি আপনার নিজস্ব অবজেক্টে Symbol.iterator প্রপার্টি যুক্ত করে ইটারেবল অবজেক্ট তৈরি করতে পারেন।
উদাহরণ:
const myIterable = {
data: [1, 2, 3],
[Symbol.iterator]() {
let index = 0;
const data = this.data;
return {
next() {
if (index < data.length) {
return { value: data[index++], done: false };
} else {
return { done: true };
}
}
};
}
};
for (let value of myIterable) {
console.log(value); // 1, 2, 3
}
এখানে, myIterable একটি কাস্টম অবজেক্ট, যেটি [Symbol.iterator] ফাংশনের মাধ্যমে নিজস্ব ইটারেটর তৈরি করেছে। এই ইটারেটরটি next() মেথডের মাধ্যমে data অ্যারের উপাদানগুলো প্রদর্শন করবে।
5. Spread Syntax এবং Iterables
Spread syntax (...) ইটারেবল অবজেক্টের উপাদানগুলিকে এক্সপ্যান্ড করতে ব্যবহৃত হয়। এটি মূলত for...of লুপের মতো কাজ করে, তবে এক লাইনে।
উদাহরণ:
const array = [1, 2, 3];
const newArray = [...array, 4, 5];
console.log(newArray); // [1, 2, 3, 4, 5]
এখানে, ...array স্প্রেড অপারেটরটি array এর উপাদানগুলোকে নতুন অ্যারে newArray তে এক্সপ্যান্ড করেছে।
6. Iterables এবং Generators
Generators ES6 এর একটি বিশেষ ধরনের ফাংশন যা ইটারেটরের কাজ করে। এটি function* কিওয়ার্ড দিয়ে ডিফাইন করা হয় এবং yield কিওয়ার্ড ব্যবহার করে একাধিক মান রিটার্ন করতে পারে। Generators স্বয়ংক্রিয়ভাবে Symbol.iterator প্রপার্টি প্রদান করে, ফলে এগুলো ইটারেবল অবজেক্ট হিসেবে ব্যবহার করা যায়।
উদাহরণ:
function* numberGenerator() {
yield 1;
yield 2;
yield 3;
}
const gen = numberGenerator();
console.log(gen.next()); // { value: 1, done: false }
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next()); // { value: 3, done: false }
console.log(gen.next()); // { done: true }
এখানে, numberGenerator একটি Generator ফাংশন যা yield কিওয়ার্ডের মাধ্যমে মান রিটার্ন করে এবং একটি iterator তৈরি করে।
সারাংশ
Iterables এবং Iterators ES6 এ নতুন ফিচার হিসেবে যোগ করা হয়েছে, যা ডেটা স্ট্রাকচারগুলির ইটারেশনকে আরও শক্তিশালী এবং নমনীয় করে তোলে। Symbol.iterator প্রপার্টি এবং next() মেথডের সাহায্যে আপনি সহজেই কাস্টম ইটারেটর তৈরি করতে পারেন এবং ডেটা এক্সপ্লোর করতে পারেন। Generators এর মাধ্যমে আপনি আরও ফ্লেক্সিবল এবং কাস্টম ইটারেটর তৈরি করতে পারেন।
Iterables ES6 (ECMAScript 2015) এর একটি গুরুত্বপূর্ণ কনসেপ্ট, যা একটি অবজেক্টকে রিপিটেবল বা লুপ করার উপযোগী করে তোলে। কোনো অবজেক্ট যদি iterable হয়, তাহলে আপনি সেই অবজেক্টের উপাদানগুলোকে একে একে এক্সেস করতে পারেন, সাধারণত for...of লুপ ব্যবহার করে।
Iterables কি?
Iterable হলো এমন একটি অবজেক্ট, যার মধ্যে Symbol.iterator মেথড থাকে। এই মেথডটি অবজেক্টের উপাদানগুলোর একটি সিরিজ (যেমন, অ্যারে, স্ট্রিং, ম্যাপ, সেট ইত্যাদি) রিটার্ন করে, যা next() মেথডের মাধ্যমে একে একে এক্সেস করা যায়।
Symbol.iteratorএকটি বিল্ট-ইন সিম্বল, যা এই অবজেক্টটিকে iterable হিসেবে চিহ্নিত করে এবং তা থেকে উপাদান এক্সট্র্যাক্ট করতে সক্ষম করে।
Iterables কিভাবে কাজ করে?
Symbol.iterator মেথড: যে কোনো অবজেক্টকে iterable বানানোর জন্য, তাকে
Symbol.iteratorমেথড ইমপ্লিমেন্ট করতে হবে। এই মেথডটি একটি ইটারেটর রিটার্ন করে, যা প্রতিবারnext()মেথড কল করার মাধ্যমে অবজেক্টের পরবর্তী ভ্যালু প্রদান করে।উদাহরণ:
const arr = [1, 2, 3]; const iterator = arr[Symbol.iterator](); // iterator অবজেক্ট পাওয়া যাচ্ছে console.log(iterator.next()); // { value: 1, done: false } console.log(iterator.next()); // { value: 2, done: false } console.log(iterator.next()); // { value: 3, done: false } console.log(iterator.next()); // { value: undefined, done: true }এখানে,
arr[Symbol.iterator]()একটি ইটারেটর অবজেক্ট রিটার্ন করেছে, এবং এর মধ্যেnext()মেথড ব্যবহার করে অ্যারের উপাদানগুলো একে একে পাওয়া গেছে।for...ofলুপ ব্যবহার করা:for...ofলুপ ES6 এর একটি সুবিধাজনক লুপ স্ট্রাকচার, যা iterable অবজেক্টের প্রতিটি উপাদানকে এক এক করে এক্সেস করতে ব্যবহৃত হয়।উদাহরণ:
const arr = [1, 2, 3]; for (let value of arr) { console.log(value); // 1, 2, 3 }এখানে,
for...ofলুপ ব্যবহার করেarrঅ্যারের সব উপাদানকে এক এক করে প্রিন্ট করা হয়েছে।
Iterables এর উদাহরণ
Array (অ্যারে): অ্যারে ES6 এর একটি iterable অবজেক্ট। আপনি
for...ofলুপ ব্যবহার করে অ্যারের প্রতিটি উপাদান একে একে এক্সেস করতে পারেন।উদাহরণ:
const numbers = [10, 20, 30]; for (let num of numbers) { console.log(num); // 10, 20, 30 }String (স্ট্রিং): স্ট্রিংও একটি iterable অবজেক্ট। আপনি স্ট্রিং এর প্রতিটি চরিত্র একে একে এক্সেস করতে পারেন।
উদাহরণ:
const greeting = "Hello"; for (let char of greeting) { console.log(char); // H, e, l, l, o }Map এবং Set: ES6 এ Map এবং Set অবজেক্টগুলোকেও iterable হিসেবে তৈরি করা হয়েছে। আপনি এই অবজেক্টগুলোর উপাদানগুলোকেও
for...ofলুপ ব্যবহার করে এক্সেস করতে পারেন।Map এর উদাহরণ:
const map = new Map([ ["name", "Alice"], ["age", 30] ]); for (let [key, value] of map) { console.log(key, value); // name Alice, age 30 }Set এর উদাহরণ:
const set = new Set([1, 2, 3]); for (let value of set) { console.log(value); // 1, 2, 3 }
Iterables এর সুবিধা
- কোডের সংক্ষিপ্ততা এবং পরিষ্কারতা:
for...ofলুপ এবং অন্যান্য ইটারেটিভ পদ্ধতি ব্যবহার করে, আপনি iterable অবজেক্টের উপাদানগুলো সহজেই এক্সেস করতে পারেন, যা কোডের পাঠযোগ্যতা এবং সংক্ষিপ্ততা বাড়ায়। - পুনঃব্যবহারযোগ্যতা: Iterables ব্যবহার করে আপনি কোডকে আরও মডুলার ও পুনঃব্যবহারযোগ্য করে তুলতে পারেন। আপনি একই মেথড বা লজিক ব্যবহার করে বিভিন্ন ধরনের iterable অবজেক্টে কাজ করতে পারবেন।
- অ্যাসিঙ্ক্রোনাস কোড এবং স্ট্রিম প্রোসেসিং: Iterables অ্যাসিঙ্ক্রোনাস কোড বা স্ট্রিম প্রোসেসিংএও সাহায্য করতে পারে, কারণ আপনি এক এক করে ডেটা প্রসেস করতে পারেন, যেমন ওয়েব রিকোয়েস্টের ফলাফল বা ফাইল ডেটা।
Conclusion
Iterables ES6 এর একটি শক্তিশালী ফিচার যা কোডকে আরও সহজ এবং সংগঠিত করতে সাহায্য করে। এটি অবজেক্টগুলোর উপাদানগুলোকে একে একে এক্সেস করার জন্য একটি স্ট্যান্ডার্ড পদ্ধতি প্রদান করে, যা কোডের রিডেবিলিটি এবং ডিবাগিং সহজ করে তোলে। for...of লুপের মতো শক্তিশালী টুল ব্যবহার করে আপনি ইটারেবল অবজেক্টের সাথে কাজ করতে পারবেন, যা আপনার কোডের কার্যকারিতা এবং পুনঃব্যবহারযোগ্যতা বাড়ায়।
Custom Iterators ES6 এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা ব্যবহারকারীদের (users) তাদের নিজস্ব কাস্টম iterators তৈরি করার অনুমতি দেয়। Iterators এমন একটি অবজেক্ট যা ইটারেটেবল ডেটার উপর ইটারেশন পরিচালনা করে, অর্থাৎ, এটি ডেটার একের পর এক উপাদান (element) অ্যাক্সেস করার উপায় প্রদান করে।
ES6-এ iterable ডেটা স্ট্রাকচার (যেমন: অ্যারে, ম্যাপ, সেট) রয়েছে, এবং আপনি চাইলে কাস্টম অবজেক্টেও এই ইটারেটিং পদ্ধতি প্রয়োগ করতে পারেন।
Iterator Interface
একটি কাস্টম ইটারেটর তৈরি করার জন্য, আপনাকে একটি অবজেক্টে [Symbol.iterator] মেথড সংজ্ঞায়িত করতে হবে। এই মেথডটি একটি iterator অবজেক্ট রিটার্ন করবে, যার মধ্যে next() মেথড থাকবে। next() মেথডটি একটি অবজেক্ট রিটার্ন করে, যার মধ্যে দুটি প্রপার্টি থাকবে:
value: পরবর্তী মান (value) যা রিটার্ন করা হবে।done: একটি বুলিয়ান মান যা নির্দেশ করে যে ইটারেশন শেষ হয়েছে কিনা।
Custom Iterator তৈরি করার উদাহরণ
এখানে, একটি কাস্টম অবজেক্ট তৈরি করা হয়েছে যার মাধ্যমে আপনি নিজে ইটারেটর কাস্টমাইজ করতে পারবেন।
উদাহরণ:
const myIterable = {
start: 1,
end: 5,
// [Symbol.iterator] মেথডের মাধ্যমে iterator কাস্টমাইজ করা হচ্ছে
[Symbol.iterator]() {
let current = this.start;
let last = this.end;
// iterator অবজেক্ট রিটার্ন
return {
next() {
if (current <= last) {
return { value: current++, done: false }; // value রিটার্ন এবং done false থাকবে
} else {
return { value: undefined, done: true }; // done true হলে ইটারেশন শেষ
}
}
};
}
};
// ইটারেটর ব্যবহার করা হচ্ছে
for (let value of myIterable) {
console.log(value); // 1, 2, 3, 4, 5
}
এখানে, [Symbol.iterator] মেথডটি আমাদের কাস্টম ইটারেটর তৈরি করেছে, যা ১ থেকে ৫ পর্যন্ত সংখ্যাগুলি ইটারেট করবে। যখন next() মেথড কল হবে, তখন প্রতিবার একটি নতুন value রিটার্ন হবে, যতক্ষণ না ইটারেশন শেষ হবে।
Custom Iterator এর ফিচার
[Symbol.iterator]মেথড: এটি একটি মেথড যা কাস্টম ইটারেটর তৈরি করার জন্য দরকার। এটি এক বা একাধিকnext()মেথডের সাথে একটি অবজেক্ট রিটার্ন করবে।next()মেথড: এটি প্রতিবার ইটারেশন চলাকালীন পরবর্তী মান এবংdoneস্টেটাস রিটার্ন করবে।
done এর ব্যবহার
done প্রপার্টি নির্ধারণ করে যে ইটারেটরটি আর কোনও মান রিটার্ন করবে কি না। done মানটি true হলে, ইটারেটর শেষ এবং ইটারেশন বন্ধ হয়ে যাবে।
উদাহরণ:
const myIterable = {
start: 10,
end: 12,
[Symbol.iterator]() {
let current = this.start;
let last = this.end;
return {
next() {
if (current <= last) {
return { value: current++, done: false };
} else {
return { value: undefined, done: true }; // done: true হলে আর কিছু রিটার্ন হবে না
}
}
};
}
};
for (let num of myIterable) {
console.log(num); // 10, 11, 12
}
অতিরিক্ত উদাহরণ: Reverse Iterable
একটি কাস্টম ইটারেটর ব্যবহার করে একটি রিভার্স (reverse) ইটারেটর তৈরি করা যায়, যা শেষ থেকে শুরু করে মান গুলি রিটার্ন করবে।
উদাহরণ:
const reverseIterable = {
start: 5,
end: 1,
[Symbol.iterator]() {
let current = this.start;
let last = this.end;
return {
next() {
if (current >= last) {
return { value: current--, done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
for (let num of reverseIterable) {
console.log(num); // 5, 4, 3, 2, 1
}
এখানে, reverseIterable একটি অবজেক্ট যেটি ৫ থেকে ১ পর্যন্ত মান রিটার্ন করে, অর্থাৎ রিভার্স অর্ডারে ইটারেট করা হচ্ছে।
Custom Iterators এর সুবিধা
- অবজেক্টের উপর কাস্টম ইটারেশন: আপনি যেকোনো অবজেক্টের উপর কাস্টম ইটারেটর তৈরি করে ইটারেশন প্রক্রিয়াকে কাস্টমাইজ করতে পারবেন।
- অধিক কাস্টমাইজেশন: আপনি ইটারেটরের লজিক পুরোপুরি কাস্টমাইজ করতে পারবেন (যেমন একটি নির্দিষ্ট শর্তে মান রিটার্ন না করা, বা রিভার্স ইটারেশন করা)।
- অবজেক্টের সাথে ইন্টারফেস ফিচার সংযোগ:
[Symbol.iterator]এর মাধ্যমে ইটারেটেবল অবজেক্ট তৈরি করা সহজ।
সারাংশ
Custom Iterators ES6 এর শক্তিশালী ফিচার যা আপনাকে ইটারেশন প্রক্রিয়াকে কাস্টমাইজ করার সুযোগ দেয়। [Symbol.iterator] এবং next() মেথডের মাধ্যমে আপনি বিভিন্ন ধরনের কাস্টম ইটারেটর তৈরি করতে পারবেন, যা কোডকে আরও কার্যকর এবং সংগঠিত করতে সহায়ক।
ES6 (ECMAScript 2015) এ for...of লুপ এবং Iterables নিয়ে নতুন ফিচারগুলোর পরিচিতি দেওয়া হয়েছে। for...of লুপটি আপনাকে একটি iterable (যেমন: Array, String, Map, Set, ইত্যাদি) এর উপাদানগুলির উপর ইটারেট করতে সাহায্য করে, যা একটি অত্যন্ত কার্যকরী এবং সহজ পদ্ধতি।
Iterables কী?
Iterable হল এমন একটি অবজেক্ট, যা তার উপাদানগুলোকে একে একে অ্যাক্সেস করার জন্য একটি পদ্ধতি সরবরাহ করে। সাধারণত, যেকোনো অবজেক্ট যা Symbol.iterator মেথড প্রদান করে, তাকে iterable বলা হয়।
অথবা, যেসব ডেটা স্ট্রাকচারগুলোর উপাদানগুলোকে একটি করে পাওয়ার সুবিধা রয়েছে, যেমন:
- Arrays
- Strings
- Maps
- Sets
- এবং অন্যান্য iterator সমর্থিত অবজেক্ট
Example of Iterable:
const arr = [1, 2, 3];
console.log(arr[Symbol.iterator]); // [Function: values]
এখানে, arr একটি iterable অবজেক্ট কারণ এটি Symbol.iterator মেথডের মাধ্যমে তার উপাদানগুলিকে একে একে অ্যাক্সেস করতে সক্ষম।
for...of লুপ
for...of লুপটি ES6 এ একটি নতুন ধরনের লুপ যা iterable অবজেক্টের উপাদানগুলো একে একে পাওয়ার জন্য ব্যবহৃত হয়। এটি for...in লুপের থেকে ভিন্ন, কারণ for...in লুপটি অবজেক্টের কী-এর উপর লুপ করে, কিন্তু for...of লুপটি উপাদানগুলোর মানের উপর কাজ করে।
for...of লুপ এর সিনট্যাক্স
for (let item of iterable) {
// item ব্যবহার করুন
}
এখানে, iterable একটি iterable অবজেক্ট এবং item হলো সেই অবজেক্টের প্রতিটি উপাদান।
for...of লুপ এর উদাহরণ
1. Array এর উপাদান দিয়ে for...of লুপ
const numbers = [10, 20, 30, 40];
for (let number of numbers) {
console.log(number);
}
// Output:
// 10
// 20
// 30
// 40
এখানে, numbers অ্যারের প্রতিটি উপাদানকে for...of লুপের মাধ্যমে একে একে আউটপুট করা হয়েছে।
2. String এর উপাদান দিয়ে for...of লুপ
const greeting = "Hello";
for (let char of greeting) {
console.log(char);
}
// Output:
// H
// e
// l
// l
// o
এখানে, greeting স্ট্রিংটির প্রতিটি অক্ষর for...of লুপ দিয়ে আউটপুট করা হয়েছে।
3. Map এর উপাদান দিয়ে for...of লুপ
const map = new Map();
map.set('name', 'John');
map.set('age', 30);
for (let [key, value] of map) {
console.log(`${key}: ${value}`);
}
// Output:
// name: John
// age: 30
এখানে, map (যা একটি Map অবজেক্ট) এর কীগুলি এবং মানগুলির উপর for...of লুপ কাজ করছে।
4. Set এর উপাদান দিয়ে for...of লুপ
const uniqueNumbers = new Set([1, 2, 3, 4]);
for (let number of uniqueNumbers) {
console.log(number);
}
// Output:
// 1
// 2
// 3
// 4
এখানে, uniqueNumbers একটি Set অবজেক্ট, যার প্রতিটি উপাদানকে for...of লুপ দিয়ে আউটপুট করা হয়েছে।
for...of লুপের বৈশিষ্ট্য
- Iterables এর উপর কাজ করে: এটি শুধুমাত্র iterable অবজেক্টের উপাদানগুলো লুপ করে। তাই আপনি Arrays, Strings, Maps, Sets ইত্যাদি এর উপাদানগুলোর উপর লুপ করতে পারবেন।
- উপাদান ব্যবহার সহজ: এটি সরাসরি উপাদানকে অ্যাক্সেস করতে সাহায্য করে, যা
for...inলুপের তুলনায় আরও পরিষ্কার এবং সোজা। - কোনো ইনডেক্সের প্রয়োজন নেই:
for...ofলুপে ইনডেক্স নির্দিষ্ট করা লাগে না, এটি স্বয়ংক্রিয়ভাবে পরবর্তী উপাদানে চলে যায়।
for...in এবং for...of এর মধ্যে পার্থক্য
| বৈশিষ্ট্য | for...in | for...of |
|---|---|---|
| কাজ করে | অবজেক্টের কীগুলির উপর | iterable অবজেক্টের উপাদানগুলির উপর |
| ব্যবহার | অবজেক্টের কীগুলি ইটারেট করতে | Array, String, Map, Set, ইত্যাদি ইটারেট করতে |
| উদাহরণ | for (let key in object) | for (let value of iterable) |
| উপাদান | কীগুলির মান | উপাদানগুলির মান |
উপসংহার
for...of লুপ ES6 এর একটি শক্তিশালী ফিচার, যা iterable অবজেক্টের উপাদানগুলির উপর সহজ এবং কার্যকরীভাবে লুপ করতে সাহায্য করে। এটি কোডকে আরও পরিষ্কার এবং সহজ করে তোলে এবং for...in লুপের তুলনায় অধিক সুবিধাজনক।
ES6 (ECMAScript 2015) এ Iterator এবং Iterable কনসেপ্টগুলি চালু করা হয়েছে, যা JavaScript এ আরও উন্নত এবং কার্যকরী ডেটা ট্রাভার্সাল (data traversal) এবং কন্টেইনার ডেটা স্ট্রাকচার তৈরির জন্য সহায়ক। এগুলোর মাধ্যমে আপনি একটি ডেটা স্ট্রাকচার (যেমন Array, Map, Set) এর উপর সহজে iteration (পর্যায়ক্রমে উপাদান গুলোর মধ্য দিয়ে যাওয়া) করতে পারেন।
Iterator কী?
Iterator হলো একটি অবজেক্ট যা আপনাকে একটি Iterable ডেটা স্ট্রাকচারের (যেমন Array বা Set) উপর এক এক করে গেট (access) করতে সক্ষম করে। এটা এক ধরনের অবজেক্ট যা next() মেথড প্রদান করে, যেটি পরবর্তী মান রিটার্ন করে।
Iterator এর মধ্যে দুটি মূল প্রপার্টি থাকে:
value: পরবর্তী মান যা রিটার্ন করা হয়েছে।done: একটি বুলিয়ান (boolean) মান যা জানায় যে iteration শেষ হয়েছে কিনা। যদি সব উপাদান iterated হয়ে যায়, তবে এটিtrueহয়ে যাবে।
Iterable কী?
Iterable একটি অবজেক্ট যা Iterator প্রদান করতে পারে। সহজভাবে, এটি এমন একটি অবজেক্ট যা Symbol.iterator মেথড সমর্থন করে। উদাহরণস্বরূপ, Array, Set, Map এবং এমনকি String ইত্যাদি iterable অবজেক্ট।
যেকোনো iterable অবজেক্টের উপর iteration করার জন্য আপনি for...of লুপ ব্যবহার করতে পারেন, যা Symbol.iterator মেথডকে কল করে।
Iterator এর ব্যবহার
Basic Iterator Example
এখানে একটি সাধারণ iterator তৈরি করার উদাহরণ দেওয়া হল:
const array = [10, 20, 30];
const iterator = array[Symbol.iterator](); // Iterator তৈরি
console.log(iterator.next()); // { value: 10, done: false }
console.log(iterator.next()); // { value: 20, done: false }
console.log(iterator.next()); // { value: 30, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
এখানে, array[Symbol.iterator]() ব্যবহার করে iterator তৈরি করা হয়েছে। next() মেথড প্রতিটি মান রিটার্ন করে এবং done: true জানায় যে iteration শেষ হয়েছে।
Iterable Object Example
আপনি যদি কোনো অবজেক্টকে iterable বানাতে চান, তাহলে আপনাকে Symbol.iterator মেথড ব্যবহার করতে হবে।
উদাহরণ:
const myIterable = {
data: [1, 2, 3],
[Symbol.iterator]() {
let index = 0;
const data = this.data;
return {
next() {
if (index < data.length) {
return { value: data[index++], done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
const iterator = myIterable[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
এখানে, Symbol.iterator মেথড দিয়ে একটি অবজেক্টকে iterable করা হয়েছে এবং তারপর সেই অবজেক্টের উপর iteration করা হয়েছে।
For...of লুপের মাধ্যমে Iteration
for...of লুপ ব্যবহার করে iterable ডেটা স্ট্রাকচারের উপাদানগুলোর উপর iteration করা সহজ। এটি next() মেথডের সাথে কাজ করে, কিন্তু for...of এর মাধ্যমে আপনি সরাসরি উপাদানগুলো অ্যাক্সেস করতে পারেন।
উদাহরণ:
const array = [1, 2, 3];
for (const value of array) {
console.log(value); // 1, 2, 3
}
এখানে, for...of লুপ দিয়ে আমরা সরাসরি array এর উপাদানগুলোর উপর iteration করেছি। এটি Iterator এর next() মেথডের সাথে কাজ করে, কিন্তু কোডটি অনেক সহজ এবং পরিষ্কার হয়।
Iterator এবং Iterable এর সুবিধা
1. Custom Iteration Logic:
যখন আপনি একটি কাস্টম iterable অবজেক্ট তৈরি করেন, তখন আপনি iteration এর আচরণ কাস্টমাইজ করতে পারেন। যেমন, আপনি যদি একটি অবজেক্টের মধ্যে থাকা কিছু নির্দিষ্ট মানের উপর iteration করতে চান, তবে আপনি Symbol.iterator মেথডের ভিতরে সেই লজিকটি নির্ধারণ করতে পারেন।
2. Data Structure Traversal:
Iterator এবং Iterable এর মাধ্যমে বিভিন্ন ধরনের ডেটা স্ট্রাকচার যেমন Array, Set, Map ইত্যাদি ট্রাভার্স (পাড়) করা সহজ হয়ে যায়। আপনি for...of বা next() মেথডের মাধ্যমে উপাদানগুলো একে একে বের করতে পারেন।
3. Lazy Evaluation:
Iterator অনেক সময় lazy evaluation এর মতো কাজ করতে পারে, যেখানে পরবর্তী উপাদানটি কেবল তখনই রিটার্ন হয় যখন তা প্রয়োজন। এটি আপনার কোডের পারফরমেন্স এবং মেমরি ব্যবস্থাপনায় সহায়ক হতে পারে, বিশেষ করে বড় ডেটা সেটগুলোর ক্ষেত্রে।
4. Code Clarity and Readability:
Iterator এবং Iterable ব্যবহারের মাধ্যমে আপনার কোড আরও পরিষ্কার এবং সোজা হয়ে যায়, কারণ এটি আপনাকে একটি সাধারণ এবং সংগঠিত পদ্ধতিতে iteration করতে সাহায্য করে।
Conclusion
ES6 এর Iterator এবং Iterable কনসেপ্টগুলো JavaScript কোডের কার্যকারিতা এবং পরিষ্কারতা বাড়াতে সাহায্য করে। এগুলোর মাধ্যমে আপনি সহজেই বিভিন্ন ডেটা স্ট্রাকচারের উপাদানগুলোর উপর iteration করতে পারেন এবং কাস্টম iteration লজিক তৈরি করতে পারেন। for...of লুপ ব্যবহার করে এই iteration আরও সহজ এবং কার্যকরী করা সম্ভব।
Read more