ஜாவாஸ்கிரிப்ட் இட்டரேட்டர் புரோட்டோகாலைப் புரிந்துகொண்டு செயல்படுத்துவதற்கான ஒரு விரிவான வழிகாட்டி. இது மேம்பட்ட தரவு கையாளுதலுக்காக தனிப்பயன் இட்டரேட்டர்களை உருவாக்க உங்களுக்கு உதவும்.
ஜாவாஸ்கிரிப்ட் இட்டரேட்டர் புரோட்டோகால் மற்றும் தனிப்பயன் இட்டரேட்டர்களைப் பற்றிய விளக்கம்
ஜாவாஸ்கிரிப்டின் இட்டரேட்டர் புரோட்டோகால், தரவுக் கட்டமைப்புகளை வரிசையாகப் பெறுவதற்கு ஒரு தரப்படுத்தப்பட்ட வழியை வழங்குகிறது. இந்த புரோட்டோகாலைப் புரிந்துகொள்வது, டெவலப்பர்களுக்கு உள்ளமைக்கப்பட்ட இட்டரபிள்களான (iterables) அரேக்கள் (arrays) மற்றும் ஸ்டிரிங்ஸ் (strings) போன்றவற்றுடன் திறமையாக வேலை செய்யவும், குறிப்பிட்ட தரவுக் கட்டமைப்புகள் மற்றும் பயன்பாட்டுத் தேவைகளுக்கு ஏற்ப தங்கள் சொந்த தனிப்பயன் இட்டரபிள்களை உருவாக்கவும் உதவுகிறது. இந்த வழிகாட்டி, இட்டரேட்டர் புரோட்டோகால் மற்றும் தனிப்பயன் இட்டரேட்டர்களை எவ்வாறு செயல்படுத்துவது என்பது பற்றிய விரிவான ஆய்வை வழங்குகிறது.
இட்டரேட்டர் புரோட்டோகால் என்றால் என்ன?
ஒரு ஆப்ஜெக்டை எவ்வாறு இட்டரேட் (iterate) செய்வது, அதாவது அதன் கூறுகளை எவ்வாறு வரிசையாக அணுகுவது என்பதை இட்டரேட்டர் புரோட்டோகால் வரையறுக்கிறது. இது இரண்டு பகுதிகளைக் கொண்டுள்ளது: இட்டரபிள் (Iterable) புரோட்டோகால் மற்றும் இட்டரேட்டர் (Iterator) புரோட்டோகால்.
இட்டரபிள் புரோட்டோகால்
ஒரு ஆப்ஜெக்டில் Symbol.iterator
என்ற கீ (key) உடன் ஒரு மெத்தட் இருந்தால் அது இட்டரபிள் என்று கருதப்படுகிறது. இந்த மெத்தட், இட்டரேட்டர் புரோட்டோகாலுக்கு இணங்க ஒரு ஆப்ஜெக்டைத் திருப்பித் தர வேண்டும்.
சுருக்கமாக, ஒரு இட்டரபிள் ஆப்ஜெக்ட் தனக்கான ஒரு இட்டரேட்டரை எப்படி உருவாக்குவது என்பதை அறிந்திருக்கிறது.
இட்டரேட்டர் புரோட்டோகால்
இட்டரேட்டர் புரோட்டோகால் ஒரு வரிசையிலிருந்து மதிப்புகளை எவ்வாறு பெறுவது என்பதை வரையறுக்கிறது. ஒரு ஆப்ஜெக்டில் இரண்டு பண்புகளை (properties) கொண்ட ஒரு ஆப்ஜெக்டைத் திருப்பியளிக்கும் next()
மெத்தட் இருந்தால் அது ஒரு இட்டரேட்டர் என்று கருதப்படுகிறது:
value
: வரிசையில் உள்ள அடுத்த மதிப்பு.done
: இட்டரேட்டர் வரிசையின் முடிவை அடைந்துவிட்டதா என்பதைக் குறிக்கும் ஒரு பூலியன் (boolean) மதிப்பு.done
true
ஆக இருந்தால்,value
பண்பை விட்டுவிடலாம்.
next()
மெத்தட் தான் இட்டரேட்டர் புரோட்டோகாலின் முக்கியப் பகுதி. next()
-க்கான ஒவ்வொரு அழைப்பும் இட்டரேட்டரை முன்னேற்றி, வரிசையில் உள்ள அடுத்த மதிப்பைக் கொடுக்கும். அனைத்து மதிப்புகளும் திருப்பியளிக்கப்பட்டதும், next()
மெத்தட் done
என்பதை true
ஆகக் கொண்ட ஒரு ஆப்ஜெக்டைத் திருப்பியளிக்கும்.
உள்ளமைக்கப்பட்ட இட்டரபிள்கள்
ஜாவாஸ்கிரிப்ட் இயல்பாகவே இட்டரபிள்களாக இருக்கும் பல உள்ளமைக்கப்பட்ட தரவுக் கட்டமைப்புகளை வழங்குகிறது. அவற்றில் சில:
- அரேக்கள் (Arrays)
- ஸ்டிரிங்ஸ் (Strings)
- மேப்ஸ் (Maps)
- செட்ஸ் (Sets)
- ஒரு ஃபங்ஷனின் Arguments ஆப்ஜெக்ட்
- டைப்டு அரேக்கள் (TypedArrays)
இந்த இட்டரபிள்களை for...of
லூப், ஸ்ப்ரெட் சிண்டாக்ஸ் (...
), மற்றும் இட்டரேட்டர் புரோட்டோகாலைச் சார்ந்த பிற கட்டமைப்புகளுடன் நேரடியாகப் பயன்படுத்தலாம்.
அரேக்களுடன் உதாரணம்:
const myArray = ["apple", "banana", "cherry"];
for (const item of myArray) {
console.log(item); // வெளியீடு: apple, banana, cherry
}
ஸ்டிரிங்ஸுடன் உதாரணம்:
const myString = "Hello";
for (const char of myString) {
console.log(char); // வெளியீடு: H, e, l, l, o
}
for...of
லூப்
for...of
லூப் என்பது இட்டரபிள் ஆப்ஜெக்ட்களை இட்டரேட் செய்வதற்கான ஒரு சக்திவாய்ந்த கட்டமைப்பாகும். இது இட்டரேட்டர் புரோட்டோகாலின் சிக்கல்களை தானாகவே கையாளுகிறது, இதனால் ஒரு வரிசையில் உள்ள மதிப்புகளை அணுகுவது எளிதாகிறது.
for...of
லூப்பின் சிண்டாக்ஸ்:
for (const element of iterable) {
// ஒவ்வொரு உறுப்புக்கும் இயக்கப்பட வேண்டிய குறியீடு
}
for...of
லூப், இட்டரபிள் ஆப்ஜெக்டிலிருந்து இட்டரேட்டரைப் பெறுகிறது (Symbol.iterator
ஐப் பயன்படுத்தி), மற்றும் இட்டரேட்டரின் next()
மெத்தடை done
என்பது true
ஆகும் வரை மீண்டும் மீண்டும் அழைக்கிறது. ஒவ்வொரு இட்டரேஷனிலும், element
வேரியபிளுக்கு next()
மூலம் திருப்பியளிக்கப்பட்ட value
பண்பு ஒதுக்கப்படும்.
தனிப்பயன் இட்டரேட்டர்களை உருவாக்குதல்
ஜாவாஸ்கிரிப்ட் உள்ளமைக்கப்பட்ட இட்டரபிள்களை வழங்கினாலும், இட்டரேட்டர் புரோட்டோகாலின் உண்மையான சக்தி உங்கள் சொந்த தரவுக் கட்டமைப்புகளுக்கு தனிப்பயன் இட்டரேட்டர்களை வரையறுக்கும் திறனில் உள்ளது. இது உங்கள் தரவு எவ்வாறு வரிசையாகப் பெறப்படுகிறது மற்றும் அணுகப்படுகிறது என்பதைக் கட்டுப்படுத்த உங்களை அனுமதிக்கிறது.
ஒரு தனிப்பயன் இட்டரேட்டரை உருவாக்குவது எப்படி என்பது இங்கே:
- உங்கள் தனிப்பயன் தரவுக் கட்டமைப்பைக் குறிக்கும் ஒரு கிளாஸ் (class) அல்லது ஆப்ஜெக்டை வரையறுக்கவும்.
- உங்கள் கிளாஸ் அல்லது ஆப்ஜெக்டில்
Symbol.iterator
மெத்தடை செயல்படுத்தவும். இந்த மெத்தட் ஒரு இட்டரேட்டர் ஆப்ஜெக்டைத் திருப்பியளிக்க வேண்டும். - அந்த இட்டரேட்டர் ஆப்ஜெக்டில்,
value
மற்றும்done
பண்புகளுடன் ஒரு ஆப்ஜெக்டைத் திருப்பியளிக்கும்next()
மெத்தட் இருக்க வேண்டும்.
உதாரணம்: ஒரு எளிய வரம்பிற்கு (Range) இட்டரேட்டர் உருவாக்குதல்
எண்களின் வரம்பைக் குறிக்கும் Range
என்ற கிளாஸை உருவாக்குவோம். அந்த வரம்பில் உள்ள எண்களை இட்டரேட் செய்ய அனுமதிப்பதற்காக இட்டரேட்டர் புரோட்டோகாலை செயல்படுத்துவோம்.
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
[Symbol.iterator]() {
let currentValue = this.start;
const that = this; // இட்டரேட்டர் ஆப்ஜெக்டின் உள்ளே பயன்படுத்த 'this' ஐப் பிடிக்கவும்
return {
next() {
if (currentValue <= that.end) {
return {
value: currentValue++,
done: false,
};
} else {
return {
value: undefined,
done: true,
};
}
},
};
}
}
const myRange = new Range(1, 5);
for (const number of myRange) {
console.log(number); // வெளியீடு: 1, 2, 3, 4, 5
}
விளக்கம்:
Range
கிளாஸ் அதன் கன்ஸ்ட்ரக்டரில்start
மற்றும்end
மதிப்புகளை எடுத்துக்கொள்கிறது.Symbol.iterator
மெத்தட் ஒரு இட்டரேட்டர் ஆப்ஜெக்டைத் திருப்பியளிக்கிறது. இந்த இட்டரேட்டர் ஆப்ஜெக்ட் அதன் சொந்த நிலையையும் (currentValue
) மற்றும் ஒருnext()
மெத்தட்டையும் கொண்டுள்ளது.next()
மெத்தட்,currentValue
வரம்பிற்குள் உள்ளதா என்பதைச் சரிபார்க்கிறது. அப்படியிருந்தால், அது தற்போதைய மதிப்பு மற்றும்done
என்பதைfalse
ஆகக் கொண்ட ஒரு ஆப்ஜெக்டைத் திருப்பியளிக்கிறது. மேலும் அடுத்த இட்டரேஷனுக்காகcurrentValue
ஐ அதிகரிக்கிறது.currentValue
ஆனதுend
மதிப்பைத் தாண்டும்போது,next()
மெத்தட்done
என்பதைtrue
ஆகக் கொண்ட ஒரு ஆப்ஜெக்டைத் திருப்பியளிக்கிறது.that = this
பயன்பாட்டைக் கவனியுங்கள். `next()` மெத்தட் வேறு ஸ்கோப்பில் (`for...of` லூப்பால்) அழைக்கப்படுவதால், `next()` உள்ளே உள்ள `this` என்பது `Range` இன்ஸ்டன்ஸைக் குறிக்காது. இதைத் தீர்க்க, `next()` ஸ்கோப்பிற்கு வெளியே `that` என்பதில் `this` மதிப்பை (அதாவது `Range` இன்ஸ்டன்ஸை) பிடித்து, பிறகு `next()` உள்ளே `that` ஐப் பயன்படுத்துகிறோம்.
உதாரணம்: ஒரு லிங்க்ட் லிஸ்டுக்கு (Linked List) இட்டரேட்டர் உருவாக்குதல்
மற்றொரு உதாரணத்தைக் கருத்தில் கொள்வோம்: ஒரு லிங்க்ட் லிஸ்ட் தரவுக் கட்டமைப்புக்கு இட்டரேட்டர் உருவாக்குதல். ஒரு லிங்க்ட் லிஸ்ட் என்பது நோட்களின் (nodes) ஒரு வரிசையாகும், இதில் ஒவ்வொரு நோடும் ஒரு மதிப்பையும், பட்டியலிலுள்ள அடுத்த நோடுக்கு ஒரு குறிப்பையும் (pointer) கொண்டிருக்கும். பட்டியலின் கடைசி நோடு null (அல்லது undefined) க்கு ஒரு குறிப்பைக் கொண்டிருக்கும்.
class LinkedListNode {
constructor(value, next = null) {
this.value = value;
this.next = next;
}
}
class LinkedList {
constructor() {
this.head = null;
}
append(value) {
const newNode = new LinkedListNode(value);
if (!this.head) {
this.head = newNode;
return;
}
let current = this.head;
while (current.next) {
current = current.next;
}
current.next = newNode;
}
[Symbol.iterator]() {
let current = this.head;
return {
next() {
if (current) {
const value = current.value;
current = current.next;
return {
value: value,
done: false
};
} else {
return {
value: undefined,
done: true
};
}
}
};
}
}
// உதாரணப் பயன்பாடு:
const myList = new LinkedList();
myList.append("London");
myList.append("Paris");
myList.append("Tokyo");
for (const city of myList) {
console.log(city); // வெளியீடு: London, Paris, Tokyo
}
விளக்கம்:
LinkedListNode
கிளாஸ் லிங்க்ட் லிஸ்டில் ஒரு தனி நோடைக் குறிக்கிறது, இது ஒருvalue
மற்றும் அடுத்த நோடுக்கு ஒரு குறிப்பை (next
) சேமிக்கிறது.LinkedList
கிளாஸ் லிங்க்ட் லிஸ்டையே குறிக்கிறது. இதுhead
என்ற பண்பைக் கொண்டுள்ளது, இது பட்டியலின் முதல் நோடைக் குறிக்கிறது.append()
மெத்தட் பட்டியலின் முடிவில் புதிய நோட்களைச் சேர்க்கிறது.Symbol.iterator
மெத்தட் ஒரு இட்டரேட்டர் ஆப்ஜெக்டை உருவாக்கி திருப்பியளிக்கிறது. இந்த இட்டரேட்டர் தற்போதைய நோடை (current
) கண்காணிக்கிறது.next()
மெத்தட் தற்போதைய நோடு உள்ளதா (current
null இல்லை) என்பதை சரிபார்க்கிறது. இருந்தால், அது தற்போதைய நோடிலிருந்து மதிப்பை எடுத்து,current
பாயிண்டரை அடுத்த நோடுக்கு நகர்த்தி, மதிப்பு மற்றும்done: false
உடன் ஒரு ஆப்ஜெக்டைத் திருப்பியளிக்கிறது.current
null ஆகும்போது (பட்டியலின் முடிவை அடைந்துவிட்டோம் என்று அர்த்தம்),next()
மெத்தட்done: true
உடன் ஒரு ஆப்ஜெக்டைத் திருப்பியளிக்கிறது.
ஜெனரேட்டர் ஃபங்ஷன்கள் (Generator Functions)
ஜெனரேட்டர் ஃபங்ஷன்கள் இட்டரேட்டர்களை உருவாக்குவதற்கு மிகவும் சுருக்கமான மற்றும் நேர்த்தியான வழியை வழங்குகின்றன. அவை தேவைக்கேற்ப மதிப்புகளை உருவாக்க yield
என்ற கீவேர்டைப் பயன்படுத்துகின்றன.
ஒரு ஜெனரேட்டர் ஃபங்ஷன் function*
சிண்டாக்ஸைப் பயன்படுத்தி வரையறுக்கப்படுகிறது.
உதாரணம்: ஜெனரேட்டர் ஃபங்ஷனைப் பயன்படுத்தி இட்டரேட்டர் உருவாக்குதல்
Range
இட்டரேட்டரை ஒரு ஜெனரேட்டர் ஃபங்ஷனைப் பயன்படுத்தி மீண்டும் எழுதுவோம்:
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
*[Symbol.iterator]() {
for (let i = this.start; i <= this.end; i++) {
yield i;
}
}
}
const myRange = new Range(1, 5);
for (const number of myRange) {
console.log(number); // வெளியீடு: 1, 2, 3, 4, 5
}
விளக்கம்:
Symbol.iterator
மெத்தட் இப்போது ஒரு ஜெனரேட்டர் ஃபங்ஷனாக உள்ளது (*
ஐக் கவனிக்கவும்).- ஜெனரேட்டர் ஃபங்ஷனுக்குள், எண்களின் வரம்பை இட்டரேட் செய்ய ஒரு
for
லூப்பைப் பயன்படுத்துகிறோம். yield
கீவேர்ட் ஜெனரேட்டர் ஃபங்ஷனின் செயல்பாட்டை இடைநிறுத்தி தற்போதைய மதிப்பை (i
) திருப்பியளிக்கிறது. அடுத்த முறை இட்டரேட்டரின்next()
மெத்தட் அழைக்கப்படும்போது, செயல்பாடு விட்ட இடத்திலிருந்து (yield
அறிக்கைக்குப் பிறகு) மீண்டும் தொடங்கும்.- லூப் முடிந்ததும், ஜெனரேட்டர் ஃபங்ஷன் மறைமுகமாக
{ value: undefined, done: true }
ஐத் திருப்பியளிக்கிறது, இது இட்டரேஷனின் முடிவைக் குறிக்கிறது.
ஜெனரேட்டர் ஃபங்ஷன்கள் next()
மெத்தட் மற்றும் done
ஃபிளாக்கை தானாகவே கையாள்வதன் மூலம் இட்டரேட்டர் உருவாக்கத்தை எளிதாக்குகின்றன.
உதாரணம்: ஃபைபோனச்சி தொடர் ஜெனரேட்டர் (Fibonacci Sequence Generator)
ஜெனரேட்டர் ஃபங்ஷன்களைப் பயன்படுத்துவதற்கான மற்றொரு சிறந்த உதாரணம் ஃபைபோனச்சி தொடரை உருவாக்குவது:
function* fibonacciSequence() {
let a = 0;
let b = 1;
while (true) {
yield a;
[a, b] = [b, a + b]; // ஒரே நேரத்தில் புதுப்பிக்க டிஸ்ட்ரக்சரிங் அசைன்மென்ட்
}
}
const fibonacci = fibonacciSequence();
for (let i = 0; i < 10; i++) {
console.log(fibonacci.next().value); // வெளியீடு: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
}
விளக்கம்:
fibonacciSequence
ஃபங்ஷன் ஒரு ஜெனரேட்டர் ஃபங்ஷன் ஆகும்.- இது ஃபைபோனச்சி தொடரின் முதல் இரண்டு எண்களுக்கு (0 மற்றும் 1)
a
மற்றும்b
என்ற இரண்டு வேரியபிள்களை துவக்குகிறது. while (true)
லூப் ஒரு முடிவற்ற வரிசையை உருவாக்குகிறது.yield a
அறிக்கைa
-இன் தற்போதைய மதிப்பை உருவாக்குகிறது.[a, b] = [b, a + b]
அறிக்கை டிஸ்ட்ரக்சரிங் அசைன்மென்ட் பயன்படுத்திa
மற்றும்b
ஐ தொடரின் அடுத்த இரண்டு எண்களுக்கு ஒரே நேரத்தில் புதுப்பிக்கிறது.fibonacci.next().value
எக்ஸ்பிரஷன் ஜெனரேட்டரிலிருந்து அடுத்த மதிப்பைப் பெறுகிறது. ஜெனரேட்டர் முடிவற்றதாக இருப்பதால், அதிலிருந்து எத்தனை மதிப்புகளை எடுக்க வேண்டும் என்பதை நீங்கள் கட்டுப்படுத்த வேண்டும். இந்த எடுத்துக்காட்டில், முதல் 10 மதிப்புகளை எடுக்கிறோம்.
இட்டரேட்டர் புரோட்டோகாலைப் பயன்படுத்துவதன் நன்மைகள்
- தரப்படுத்தல் (Standardization): இட்டரேட்டர் புரோட்டோகால் வெவ்வேறு தரவுக் கட்டமைப்புகளை இட்டரேட் செய்ய ஒரு சீரான வழியை வழங்குகிறது.
- நெகிழ்வுத்தன்மை (Flexibility): உங்கள் குறிப்பிட்ட தேவைகளுக்கு ஏற்ப தனிப்பயன் இட்டரேட்டர்களை நீங்கள் வரையறுக்கலாம்.
- வாசிப்புத்திறன் (Readability):
for...of
லூப் இட்டரேஷன் குறியீட்டை மேலும் படிக்கக்கூடியதாகவும் சுருக்கமாகவும் ஆக்குகிறது. - திறன் (Efficiency): இட்டரேட்டர்கள் சோம்பேறியாக (lazy) இருக்க முடியும், அதாவது தேவைப்படும்போது மட்டுமே மதிப்புகளை உருவாக்கும், இது பெரிய தரவுத் தொகுப்புகளுக்கான செயல்திறனை மேம்படுத்தும். உதாரணமாக, மேலே உள்ள ஃபைபோனச்சி தொடர் ஜெனரேட்டர், `next()` அழைக்கப்படும்போது மட்டுமே அடுத்த மதிப்பைக் கணக்கிடுகிறது.
- இணக்கத்தன்மை (Compatibility): இட்டரேட்டர்கள் ஸ்ப்ரெட் சிண்டாக்ஸ் மற்றும் டிஸ்ட்ரக்சரிங் போன்ற பிற ஜாவாஸ்கிரிப்ட் அம்சங்களுடன் தடையின்றி வேலை செய்கின்றன.
மேம்பட்ட இட்டரேட்டர் நுட்பங்கள்
இட்டரேட்டர்களை இணைத்தல்
நீங்கள் பல இட்டரேட்டர்களை ஒரே இட்டரேட்டராக இணைக்கலாம். பல மூலங்களிலிருந்து வரும் தரவை ஒரு ஒருங்கிணைந்த வழியில் செயலாக்க வேண்டியிருக்கும் போது இது பயனுள்ளதாக இருக்கும்.
function* combineIterators(...iterables) {
for (const iterable of iterables) {
for (const item of iterable) {
yield item;
}
}
}
const array1 = [1, 2, 3];
const array2 = ["a", "b", "c"];
const string1 = "XYZ";
const combined = combineIterators(array1, array2, string1);
for (const value of combined) {
console.log(value); // வெளியீடு: 1, 2, 3, a, b, c, X, Y, Z
}
இந்த எடுத்துக்காட்டில், `combineIterators` ஃபங்ஷன் எந்த எண்ணிக்கையிலான இட்டரபிள்களையும் ஆர்குமென்ட்களாக எடுத்துக்கொள்கிறது. இது ஒவ்வொரு இட்டரபிளையும் இட்டரேட் செய்து ஒவ்வொரு ஐட்டத்தையும் யீல்டு (yield) செய்கிறது. இதன் விளைவாக, உள்ளீட்டு இட்டரபிள்களிலிருந்து அனைத்து மதிப்புகளையும் உருவாக்கும் ஒரு ஒற்றை இட்டரேட்டர் கிடைக்கிறது.
இட்டரேட்டர்களை வடிகட்டுதல் மற்றும் மாற்றுதல்
மற்றொரு இட்டரேட்டரால் உருவாக்கப்பட்ட மதிப்புகளை வடிகட்டும் அல்லது மாற்றும் இட்டரேட்டர்களையும் நீங்கள் உருவாக்கலாம். இது தரவை ஒரு பைப்லைனில் செயலாக்க உங்களை அனுமதிக்கிறது, ஒவ்வொரு மதிப்பு உருவாக்கப்படும்போதும் அதற்கு வெவ்வேறு செயல்பாடுகளைப் பயன்படுத்தலாம்.
function* filterIterator(iterable, predicate) {
for (const item of iterable) {
if (predicate(item)) {
yield item;
}
}
}
function* mapIterator(iterable, transform) {
for (const item of iterable) {
yield transform(item);
}
}
const numbers = [1, 2, 3, 4, 5, 6];
const evenNumbers = filterIterator(numbers, (x) => x % 2 === 0);
const squaredEvenNumbers = mapIterator(evenNumbers, (x) => x * x);
for (const value of squaredEvenNumbers) {
console.log(value); // வெளியீடு: 4, 16, 36
}
இங்கே, `filterIterator` ஒரு இட்டரபிள் மற்றும் ஒரு பிரடிகேட் (predicate) ஃபங்ஷனை எடுத்துக்கொள்கிறது. பிரடிகேட் `true` எனத் திருப்பியளிக்கும் ஐட்டங்களை மட்டுமே அது யீல்டு செய்கிறது. `mapIterator` ஒரு இட்டரபிள் மற்றும் ஒரு டிரான்ஸ்ஃபார்ம் (transform) ஃபங்ஷனை எடுத்துக்கொள்கிறது. இது ஒவ்வொரு ஐட்டத்திற்கும் டிரான்ஸ்ஃபார்ம் ஃபங்ஷனைப் பயன்படுத்தியதன் முடிவை யீல்டு செய்கிறது.
நிஜ-உலக பயன்பாடுகள்
இட்டரேட்டர் புரோட்டோகால் ஜாவாஸ்கிரிப்ட் லைப்ரரிகள் மற்றும் ஃபிரேம்வொர்க்குகளில் பரவலாகப் பயன்படுத்தப்படுகிறது, மேலும் இது பல்வேறு நிஜ-உலக பயன்பாடுகளில், குறிப்பாக பெரிய தரவுத்தொகுப்புகள் அல்லது ασύγχρονη செயல்பாடுகளைக் கையாளும் போது மதிப்புமிக்கது.
- தரவு செயலாக்கம் (Data Processing): இட்டரேட்டர்கள் பெரிய தரவுத்தொகுப்புகளை திறமையாக செயலாக்கப் பயன்படுகின்றன, ஏனெனில் அவை முழு தரவுத்தொகுப்பையும் நினைவகத்தில் ஏற்றாமல் தரவை துண்டுகளாகக் கையாள உங்களை அனுமதிக்கின்றன. வாடிக்கையாளர் தரவைக் கொண்ட ஒரு பெரிய CSV கோப்பைப் பாகுபடுத்துவதை கற்பனை செய்து பாருங்கள். ஒரு இட்டரேட்டர் முழு கோப்பையும் ஒரே நேரத்தில் நினைவகத்தில் ஏற்றாமல் ஒவ்வொரு வரிசையையும் செயலாக்க உங்களை அனுமதிக்கும்.
- அசிங்க்ரோனஸ் செயல்பாடுகள் (Asynchronous Operations): API இலிருந்து தரவைப் பெறுவது போன்ற அசிங்க்ரோனஸ் செயல்பாடுகளைக் கையாள இட்டரேட்டர்களைப் பயன்படுத்தலாம். தரவு கிடைக்கும் வரை செயல்பாட்டை இடைநிறுத்தவும், பின்னர் அடுத்த மதிப்புடன் தொடரவும் ஜெனரேட்டர் ஃபங்ஷன்களைப் பயன்படுத்தலாம்.
- தனிப்பயன் தரவுக் கட்டமைப்புகள் (Custom Data Structures): குறிப்பிட்ட வரிசைமுறைத் தேவைகளைக் கொண்ட தனிப்பயன் தரவுக் கட்டமைப்புகளை உருவாக்குவதற்கு இட்டரேட்டர்கள் அவசியமானவை. ஒரு ட்ரீ (tree) தரவுக் கட்டமைப்பைக் கவனியுங்கள். ட்ரீயை ஒரு குறிப்பிட்ட வரிசையில் (எ.கா., டெப்த்-ஃபர்ஸ்ட் அல்லது ப்ரெத்-ஃபர்ஸ்ட்) கடந்து செல்ல நீங்கள் ஒரு தனிப்பயன் இட்டரேட்டரை செயல்படுத்தலாம்.
- கேம் டெவலப்மென்ட் (Game Development): கேம் டெவலப்மென்ட்டில், இட்டரேட்டர்கள் கேம் ஆப்ஜெக்ட்கள், பார்ட்டிக்கிள் எஃபெக்ட்கள் மற்றும் பிற டைனமிக் கூறுகளை நிர்வகிக்கப் பயன்படலாம்.
- பயனர் இடைமுக லைப்ரரிகள் (User Interface Libraries): பல UI லைப்ரரிகள், அடிப்படை தரவு மாற்றங்களின் அடிப்படையில் கூறுகளை திறமையாகப் புதுப்பிக்கவும் ரெண்டர் செய்யவும் இட்டரேட்டர்களைப் பயன்படுத்துகின்றன.
சிறந்த நடைமுறைகள்
Symbol.iterator
ஐ சரியாகச் செயல்படுத்தவும்: உங்கள்Symbol.iterator
மெத்தட், இட்டரேட்டர் புரோட்டோகாலுக்கு இணங்க ஒரு இட்டரேட்டர் ஆப்ஜெக்டைத் திருப்பித் தருவதை உறுதிப்படுத்தவும்.done
ஃபிளாக்கை துல்லியமாகக் கையாளவும்: இட்டரேஷனின் முடிவைக் குறிக்கdone
ஃபிளாக் முக்கியமானது. உங்கள்next()
மெத்தடில் அதை சரியாக அமைப்பதை உறுதிப்படுத்தவும்.- ஜெனரேட்டர் ஃபங்ஷன்களைப் பயன்படுத்தக் கருத்தில் கொள்ளுங்கள்: ஜெனரேட்டர் ஃபங்ஷன்கள் இட்டரேட்டர்களை உருவாக்க மிகவும் சுருக்கமான மற்றும் படிக்கக்கூடிய வழியை வழங்குகின்றன.
next()
இல் பக்க விளைவுகளைத் தவிர்க்கவும்:next()
மெத்தட் முக்கியமாக அடுத்த மதிப்பைப் பெறுவதிலும், இட்டரேட்டரின் நிலையைப் புதுப்பிப்பதிலும் கவனம் செலுத்த வேண்டும்.next()
க்குள் சிக்கலான செயல்பாடுகள் அல்லது பக்க விளைவுகளைச் செய்வதைத் தவிர்க்கவும்.- உங்கள் இட்டரேட்டர்களை முழுமையாகச் சோதிக்கவும்: உங்கள் தனிப்பயன் இட்டரேட்டர்கள் சரியாகச் செயல்படுவதை உறுதிசெய்ய, வெவ்வேறு தரவுத் தொகுப்புகள் மற்றும் சூழ்நிலைகளுடன் அவற்றைச் சோதிக்கவும்.
முடிவுரை
ஜாவாஸ்கிரிப்ட் இட்டரேட்டர் புரோட்டோகால் தரவுக் கட்டமைப்புகளை வரிசையாகப் பெறுவதற்கு ஒரு சக்திவாய்ந்த மற்றும் நெகிழ்வான வழியை வழங்குகிறது. இட்டரபிள் மற்றும் இட்டரேட்டர் புரோட்டோகால்களைப் புரிந்துகொள்வதன் மூலமும், ஜெனரேட்டர் ஃபங்ஷன்களைப் பயன்படுத்துவதன் மூலமும், உங்கள் குறிப்பிட்ட தேவைகளுக்கு ஏற்ப தனிப்பயன் இட்டரேட்டர்களை உருவாக்கலாம். இது தரவுகளுடன் திறமையாக வேலை செய்யவும், குறியீட்டின் வாசிப்புத்திறனை மேம்படுத்தவும், உங்கள் பயன்பாடுகளின் செயல்திறனை அதிகரிக்கவும் உங்களை அனுமதிக்கிறது. இட்டரேட்டர்களில் தேர்ச்சி பெறுவது ஜாவாஸ்கிரிப்டின் திறன்களைப் பற்றிய ஆழமான புரிதலைத் திறக்கிறது மற்றும் மிகவும் நேர்த்தியான மற்றும் திறமையான குறியீட்டை எழுத உங்களுக்கு அதிகாரம் அளிக்கிறது.