జావాస్క్రిప్ట్ అర్రేలతో ఫంక్షనల్ ప్రోగ్రామింగ్ శక్తిని అన్లాక్ చేయండి. అంతర్నిర్మిత పద్ధతులను ఉపయోగించి మీ డేటాను సమర్థవంతంగా మార్చడం, ఫిల్టర్ చేయడం మరియు తగ్గించడం నేర్చుకోండి.
జావాస్క్రిప్ట్ అర్రేలతో ఫంక్షనల్ ప్రోగ్రామింగ్లో ప్రావీణ్యం
నిరంతరం అభివృద్ధి చెందుతున్న వెబ్ డెవలప్మెంట్ రంగంలో, జావాస్క్రిప్ట్ ఒక మూలస్తంభంగా కొనసాగుతోంది. ఆబ్జెక్ట్-ఓరియెంటెడ్ మరియు ఇంపరేటివ్ ప్రోగ్రామింగ్ పారాడిగ్మ్లు చాలా కాలంగా ఆధిపత్యం చెలాయిస్తున్నప్పటికీ, ఫంక్షనల్ ప్రోగ్రామింగ్ (FP) గణనీయమైన ఆదరణ పొందుతోంది. FP ఇమ్మ్యూటబిలిటీ, ప్యూర్ ఫంక్షన్లు మరియు డిక్లరేటివ్ కోడ్కు ప్రాధాన్యత ఇస్తుంది, ఇది మరింత బలమైన, నిర్వహించదగిన మరియు ఊహించదగిన అప్లికేషన్లకు దారితీస్తుంది. జావాస్క్రిప్ట్లో ఫంక్షనల్ ప్రోగ్రామింగ్ను స్వీకరించడానికి అత్యంత శక్తివంతమైన మార్గాలలో ఒకటి దాని స్థానిక అర్రే పద్ధతులను ఉపయోగించడం.
ఈ సమగ్ర గైడ్ జావాస్క్రిప్ట్ అర్రేలను ఉపయోగించి మీరు ఫంక్షనల్ ప్రోగ్రామింగ్ సూత్రాల శక్తిని ఎలా ఉపయోగించుకోవచ్చో వివరిస్తుంది. మేము కీలక భావనలను అన్వేషిస్తాము మరియు map
, filter
, మరియు reduce
వంటి పద్ధతులను ఉపయోగించి వాటిని ఎలా అన్వయించాలో ప్రదర్శిస్తాము, ఇది మీరు డేటా మానిప్యులేషన్ను నిర్వహించే విధానాన్ని మారుస్తుంది.
ఫంక్షనల్ ప్రోగ్రామింగ్ అంటే ఏమిటి?
జావాస్క్రిప్ట్ అర్రేల గురించి తెలుసుకునే ముందు, ఫంక్షనల్ ప్రోగ్రామింగ్ను క్లుప్తంగా నిర్వచిద్దాం. దాని ప్రధాన భాగంలో, FP అనేది గణనను గణిత ఫంక్షన్ల మూల్యాంకనంగా పరిగణించే ఒక ప్రోగ్రామింగ్ పారాడిగ్మ్ మరియు స్టేట్ మార్చడం మరియు మ్యూటబుల్ డేటాను నివారిస్తుంది. కీలక సూత్రాలు:
- ప్యూర్ ఫంక్షన్లు (Pure Functions): ఒక ప్యూర్ ఫంక్షన్ ఎల్లప్పుడూ ఒకే ఇన్పుట్కు ఒకే అవుట్పుట్ను ఉత్పత్తి చేస్తుంది మరియు ఎటువంటి సైడ్ ఎఫెక్ట్స్ ఉండవు (ఇది బాహ్య స్టేట్ను మార్చదు).
- ఇమ్మ్యూటబిలిటీ (Immutability): ఒకసారి సృష్టించబడిన డేటాను మార్చలేము. ఇప్పటికే ఉన్న డేటాను మార్చే బదులు, కావలసిన మార్పులతో కొత్త డేటా సృష్టించబడుతుంది.
- ఫస్ట్-క్లాస్ ఫంక్షన్లు (First-Class Functions): ఫంక్షన్లను ఏ ఇతర వేరియబుల్ లాగా పరిగణించవచ్చు – వాటిని వేరియబుల్స్కు కేటాయించవచ్చు, ఇతర ఫంక్షన్లకు ఆర్గ్యుమెంట్లుగా పంపవచ్చు మరియు ఫంక్షన్ల నుండి తిరిగి ఇవ్వవచ్చు.
- డిక్లరేటివ్ వర్సెస్ ఇంపరేటివ్ (Declarative vs. Imperative): ఫంక్షనల్ ప్రోగ్రామింగ్ డిక్లరేటివ్ శైలి వైపు మొగ్గు చూపుతుంది, ఇక్కడ మీరు *ఏమి* సాధించాలనుకుంటున్నారో వివరిస్తారు, *ఎలా* సాధించాలో దశలవారీగా వివరించే ఇంపరేటివ్ శైలికి బదులుగా.
ఈ సూత్రాలను అనుసరించడం వల్ల, సంక్లిష్టమైన అప్లికేషన్లలో కూడా కోడ్ను సులభంగా అర్థం చేసుకోవడానికి, పరీక్షించడానికి మరియు డీబగ్ చేయడానికి వీలవుతుంది. జావాస్క్రిప్ట్ యొక్క అర్రే పద్ధతులు ఈ భావనలను అమలు చేయడానికి సంపూర్ణంగా సరిపోతాయి.
జావాస్క్రిప్ట్ అర్రే పద్ధతుల శక్తి
జావాస్క్రిప్ట్ అర్రేలు సాంప్రదాయ లూప్లను (for
లేదా while
వంటివి) ఆశ్రయించకుండా అధునాతన డేటా మానిప్యులేషన్కు అనుమతించే అంతర్నిర్మిత పద్ధతుల యొక్క గొప్ప సమితితో వస్తాయి. ఈ పద్ధతులు తరచుగా కొత్త అర్రేలను తిరిగి ఇస్తాయి, ఇమ్మ్యూటబిలిటీని ప్రోత్సహిస్తాయి మరియు కాల్బ్యాక్ ఫంక్షన్లను అంగీకరిస్తాయి, ఇది ఫంక్షనల్ విధానాన్ని అనుమతిస్తుంది.
అత్యంత ప్రాథమిక ఫంక్షనల్ అర్రే పద్ధతులను అన్వేషిద్దాం:
1. Array.prototype.map()
map()
పద్ధతి, పిలవబడిన అర్రేలోని ప్రతి మూలకంపై అందించిన ఫంక్షన్ను అమలు చేయడం ద్వారా వచ్చే ఫలితాలతో నింపబడిన కొత్త అర్రేను సృష్టిస్తుంది. ఇది ఒక అర్రేలోని ప్రతి మూలకాన్ని కొత్తదానిగా మార్చడానికి అనువైనది.
సింటాక్స్:
array.map(callback(currentValue[, index[, array]])[, thisArg])
callback
: ప్రతి మూలకం కోసం అమలు చేయవలసిన ఫంక్షన్.currentValue
: అర్రేలో ప్రాసెస్ చేయబడుతున్న ప్రస్తుత మూలకం.index
(ఐచ్ఛికం): ప్రాసెస్ చేయబడుతున్న ప్రస్తుత మూలకం యొక్క ఇండెక్స్.array
(ఐచ్ఛికం):map
పిలవబడిన అర్రే.thisArg
(ఐచ్ఛికం):callback
ను అమలు చేస్తున్నప్పుడుthis
గా ఉపయోగించవలసిన విలువ.
కీలక లక్షణాలు:
- ఒక కొత్త అర్రేను తిరిగి ఇస్తుంది.
- అసలు అర్రే మార్చబడదు (ఇమ్మ్యూటబిలిటీ).
- కొత్త అర్రే అసలు అర్రే వలె అదే పొడవును కలిగి ఉంటుంది.
- కాల్బ్యాక్ ఫంక్షన్ ప్రతి మూలకం కోసం మార్చబడిన విలువను తిరిగి ఇవ్వాలి.
ఉదాహరణ: ప్రతి సంఖ్యను రెట్టింపు చేయడం
మీ వద్ద సంఖ్యల అర్రే ఉందని మరియు మీరు ప్రతి సంఖ్యను రెట్టింపు చేసిన కొత్త అర్రేను సృష్టించాలనుకుంటున్నారని ఊహించుకోండి.
const numbers = [1, 2, 3, 4, 5];
// రూపాంతరం కోసం మ్యాప్ ఉపయోగించి
const doubledNumbers = numbers.map(number => number * 2);
console.log(numbers); // అవుట్పుట్: [1, 2, 3, 4, 5] (అసలు అర్రే మార్చబడలేదు)
console.log(doubledNumbers); // అవుట్పుట్: [2, 4, 6, 8, 10]
ఉదాహరణ: ఆబ్జెక్ట్ల నుండి ప్రాపర్టీలను సంగ్రహించడం
ఆబ్జెక్ట్ల అర్రే నుండి నిర్దిష్ట ప్రాపర్టీలను సంగ్రహించడం ఒక సాధారణ వినియోగం. మన దగ్గర వినియోగదారుల జాబితా ఉందని మరియు వారి పేర్లను మాత్రమే పొందాలనుకుంటున్నామని అనుకుందాం.
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 3, name: 'Charlie' }
];
const userNames = users.map(user => user.name);
console.log(userNames); // అవుట్పుట్: ['Alice', 'Bob', 'Charlie']
2. Array.prototype.filter()
filter()
పద్ధతి అందించిన ఫంక్షన్ ద్వారా అమలు చేయబడిన పరీక్షలో ఉత్తీర్ణులైన అన్ని మూలకాలతో కొత్త అర్రేను సృష్టిస్తుంది. ఇది ఒక షరతు ఆధారంగా మూలకాలను ఎంచుకోవడానికి ఉపయోగించబడుతుంది.
సింటాక్స్:
array.filter(callback(element[, index[, array]])[, thisArg])
callback
: ప్రతి మూలకం కోసం అమలు చేయవలసిన ఫంక్షన్. మూలకాన్ని ఉంచడానికిtrue
లేదా దానిని విస్మరించడానికిfalse
తిరిగి ఇవ్వాలి.element
: అర్రేలో ప్రాసెస్ చేయబడుతున్న ప్రస్తుత మూలకం.index
(ఐచ్ఛికం): ప్రస్తుత మూలకం యొక్క ఇండెక్స్.array
(ఐచ్ఛికం):filter
పిలవబడిన అర్రే.thisArg
(ఐచ్ఛికం):callback
ను అమలు చేస్తున్నప్పుడుthis
గా ఉపయోగించవలసిన విలువ.
కీలక లక్షణాలు:
- ఒక కొత్త అర్రేను తిరిగి ఇస్తుంది.
- అసలు అర్రే మార్చబడదు (ఇమ్మ్యూటబిలిటీ).
- కొత్త అర్రే అసలు అర్రే కంటే తక్కువ మూలకాలను కలిగి ఉండవచ్చు.
- కాల్బ్యాక్ ఫంక్షన్ తప్పనిసరిగా బూలియన్ విలువను తిరిగి ఇవ్వాలి.
ఉదాహరణ: సరి సంఖ్యలను ఫిల్టర్ చేయడం
సంఖ్యల అర్రే నుండి కేవలం సరి సంఖ్యలను మాత్రమే ఉంచడానికి ఫిల్టర్ చేద్దాం.
const numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// సరి సంఖ్యలను ఎంచుకోవడానికి ఫిల్టర్ ఉపయోగించి
const evenNumbers = numbers.filter(number => number % 2 === 0);
console.log(numbers); // అవుట్పుట్: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
console.log(evenNumbers); // అవుట్పుట్: [2, 4, 6, 8, 10]
ఉదాహరణ: యాక్టివ్ యూజర్లను ఫిల్టర్ చేయడం
మన యూజర్ల అర్రే నుండి, యాక్టివ్గా మార్క్ చేయబడిన యూజర్ల కోసం ఫిల్టర్ చేద్దాం.
const users = [
{ id: 1, name: 'Alice', isActive: true },
{ id: 2, name: 'Bob', isActive: false },
{ id: 3, name: 'Charlie', isActive: true },
{ id: 4, name: 'David', isActive: false }
];
const activeUsers = users.filter(user => user.isActive);
console.log(activeUsers);
/* అవుట్పుట్:
[
{ id: 1, name: 'Alice', isActive: true },
{ id: 3, name: 'Charlie', isActive: true }
]
*/
3. Array.prototype.reduce()
reduce()
పద్ధతి, అర్రేలోని ప్రతి మూలకంపై యూజర్ అందించిన “రెడ్యూసర్” కాల్బ్యాక్ ఫంక్షన్ను క్రమంలో అమలు చేస్తుంది, మునుపటి మూలకంపై చేసిన గణన నుండి వచ్చిన రిటర్న్ విలువను పాస్ చేస్తుంది. అర్రేలోని అన్ని మూలకాలపై రెడ్యూసర్ను అమలు చేసిన చివరి ఫలితం ఒకే విలువగా ఉంటుంది.
ఇది అర్రే పద్ధతులలో అత్యంత బహుముఖమైనది మరియు అనేక ఫంక్షనల్ ప్రోగ్రామింగ్ ప్యాటర్న్లకు మూలస్తంభం. ఇది ఒక అర్రేను ఒకే విలువకు (ఉదా., మొత్తం, గుణకారం, లెక్కింపు లేదా కొత్త ఆబ్జెక్ట్ లేదా అర్రే కూడా) "తగ్గించడానికి" మిమ్మల్ని అనుమతిస్తుంది.
సింటాక్స్:
array.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
callback
: ప్రతి మూలకం కోసం అమలు చేయవలసిన ఫంక్షన్.accumulator
: కాల్బ్యాక్ ఫంక్షన్కు మునుపటి కాల్ నుండి వచ్చిన విలువ. మొదటి కాల్లో, ఇది అందించబడితేinitialValue
అవుతుంది; లేకపోతే, ఇది అర్రేలోని మొదటి మూలకం.currentValue
: ప్రాసెస్ చేయబడుతున్న ప్రస్తుత మూలకం.index
(ఐచ్ఛికం): ప్రస్తుత మూలకం యొక్క ఇండెక్స్.array
(ఐచ్ఛికం):reduce
పిలవబడిన అర్రే.initialValue
(ఐచ్ఛికం):callback
యొక్క మొదటి కాల్కు మొదటి ఆర్గ్యుమెంట్గా ఉపయోగించడానికి ఒక విలువ.initialValue
సరఫరా చేయకపోతే, అర్రేలోని మొదటి మూలకం ప్రారంభaccumulator
విలువగా ఉపయోగించబడుతుంది మరియు రెండవ మూలకం నుండి పునరావృతం ప్రారంభమవుతుంది.
కీలక లక్షణాలు:
- ఒక ఒకే విలువను తిరిగి ఇస్తుంది (ఇది అర్రే లేదా ఆబ్జెక్ట్ కూడా కావచ్చు).
- అసలు అర్రే మార్చబడదు (ఇమ్మ్యూటబిలిటీ).
initialValue
స్పష్టత మరియు లోపాలను నివారించడానికి చాలా ముఖ్యమైనది, ముఖ్యంగా ఖాళీ అర్రేలతో లేదా అక్యుమ్యులేటర్ రకం అర్రే మూలకం రకానికి భిన్నంగా ఉన్నప్పుడు.
ఉదాహరణ: సంఖ్యలను కూడటం
మన అర్రేలోని అన్ని సంఖ్యలను కూడుదాం.
const numbers = [1, 2, 3, 4, 5];
// సంఖ్యలను కూడటానికి reduce ఉపయోగించి
const sum = numbers.reduce((accumulator, currentValue) => accumulator + currentValue, 0); // 0 అనేది initialValue
console.log(sum); // అవుట్పుట్: 15
వివరణ:
- కాల్ 1:
accumulator
0,currentValue
1. 0 + 1 = 1 తిరిగి ఇస్తుంది. - కాల్ 2:
accumulator
1,currentValue
2. 1 + 2 = 3 తిరిగి ఇస్తుంది. - కాల్ 3:
accumulator
3,currentValue
3. 3 + 3 = 6 తిరిగి ఇస్తుంది. - మరియు చివరి మొత్తం లెక్కించబడే వరకు ఇలాగే కొనసాగుతుంది.
ఉదాహరణ: ఆబ్జెక్ట్లను ఒక ప్రాపర్టీ ద్వారా గ్రూప్ చేయడం
ఒక ఆబ్జెక్ట్ల అర్రేను ఒక నిర్దిష్ట ప్రాపర్టీ ద్వారా విలువలు గ్రూప్ చేయబడిన ఆబ్జెక్ట్గా మార్చడానికి మనం reduce
ను ఉపయోగించవచ్చు. మన యూజర్లను వారి `isActive` స్థితి ద్వారా గ్రూప్ చేద్దాం.
const users = [
{ id: 1, name: 'Alice', isActive: true },
{ id: 2, name: 'Bob', isActive: false },
{ id: 3, name: 'Charlie', isActive: true },
{ id: 4, name: 'David', isActive: false }
];
const groupedUsers = users.reduce((acc, user) => {
const status = user.isActive ? 'active' : 'inactive';
if (!acc[status]) {
acc[status] = [];
}
acc[status].push(user);
return acc;
}, {}); // ఖాళీ ఆబ్జెక్ట్ {} అనేది initialValue
console.log(groupedUsers);
/* అవుట్పుట్:
{
active: [
{ id: 1, name: 'Alice', isActive: true },
{ id: 3, name: 'Charlie', isActive: true }
],
inactive: [
{ id: 2, name: 'Bob', isActive: false },
{ id: 4, name: 'David', isActive: false }
]
}
*/
ఉదాహరణ: సంభవించిన వాటిని లెక్కించడం
జాబితాలోని ప్రతి పండు యొక్క ఫ్రీక్వెన్సీని లెక్కిద్దాం.
const fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'];
const fruitCounts = fruits.reduce((acc, fruit) => {
acc[fruit] = (acc[fruit] || 0) + 1;
return acc;
}, {});
console.log(fruitCounts); // అవుట్పుట్: { apple: 3, banana: 2, orange: 1 }
4. Array.prototype.forEach()
forEach()
కొత్త అర్రేను తిరిగి ఇవ్వదు మరియు దాని ప్రాథమిక ఉద్దేశ్యం ప్రతి అర్రే మూలకం కోసం ఒక ఫంక్షన్ను అమలు చేయడం కాబట్టి ఇది తరచుగా మరింత ఇంపరేటివ్గా పరిగణించబడుతుంది, అయినప్పటికీ ఇది ఫంక్షనల్ ప్యాటర్న్లలో పాత్ర పోషించే ఒక ప్రాథమిక పద్ధతి, ప్రత్యేకించి సైడ్ ఎఫెక్ట్స్ అవసరమైనప్పుడు లేదా మార్చబడిన అవుట్పుట్ అవసరం లేకుండా పునరావృతం చేస్తున్నప్పుడు.
సింటాక్స్:
array.forEach(callback(element[, index[, array]])[, thisArg])
కీలక లక్షణాలు:
undefined
తిరిగి ఇస్తుంది.- ప్రతి అర్రే మూలకం కోసం ఒకసారి అందించిన ఫంక్షన్ను అమలు చేస్తుంది.
- తరచుగా సైడ్ ఎఫెక్ట్స్ కోసం ఉపయోగించబడుతుంది, ఉదాహరణకు కన్సోల్కు లాగింగ్ చేయడం లేదా DOM మూలకాలను నవీకరించడం.
ఉదాహరణ: ప్రతి మూలకాన్ని లాగింగ్ చేయడం
const messages = ['Hello', 'Functional', 'World'];
messages.forEach(message => console.log(message));
// అవుట్పుట్:
// Hello
// Functional
// World
గమనిక: రూపాంతరాలు మరియు ఫిల్టరింగ్ కోసం, map
మరియు filter
వాటి ఇమ్మ్యూటబిలిటీ మరియు డిక్లరేటివ్ స్వభావం కారణంగా ప్రాధాన్యత ఇవ్వబడతాయి. కొత్త నిర్మాణంలోకి ఫలితాలను సేకరించకుండా ప్రతి అంశం కోసం ఒక చర్యను ప్రత్యేకంగా నిర్వహించాల్సిన అవసరం వచ్చినప్పుడు forEach
ఉపయోగించండి.
5. Array.prototype.find()
మరియు Array.prototype.findIndex()
ఈ పద్ధతులు ఒక అర్రేలో నిర్దిష్ట మూలకాలను గుర్తించడానికి ఉపయోగపడతాయి.
find()
: అందించిన పరీక్ష ఫంక్షన్ను సంతృప్తిపరిచే అందించిన అర్రేలోని మొదటి మూలకం యొక్క విలువను తిరిగి ఇస్తుంది. ఏ విలువలు పరీక్ష ఫంక్షన్ను సంతృప్తిపరచకపోతే,undefined
తిరిగి ఇవ్వబడుతుంది.findIndex()
: అందించిన పరీక్ష ఫంక్షన్ను సంతృప్తిపరిచే అందించిన అర్రేలోని మొదటి మూలకం యొక్క ఇండెక్స్ను తిరిగి ఇస్తుంది. లేకపోతే, ఇది -1 తిరిగి ఇస్తుంది, ఇది ఏ మూలకం పరీక్షలో ఉత్తీర్ణత సాధించలేదని సూచిస్తుంది.
ఉదాహరణ: ఒక యూజర్ను కనుగొనడం
const users = [
{ id: 1, name: 'Alice' },
{ id: 2, name: 'Bob' },
{ id: 3, name: 'Charlie' }
];
const bob = users.find(user => user.name === 'Bob');
const bobIndex = users.findIndex(user => user.name === 'Bob');
const nonExistentUser = users.find(user => user.name === 'David');
const nonExistentIndex = users.findIndex(user => user.name === 'David');
console.log(bob); // అవుట్పుట్: { id: 2, name: 'Bob' }
console.log(bobIndex); // అవుట్పుట్: 1
console.log(nonExistentUser); // అవుట్పుట్: undefined
console.log(nonExistentIndex); // అవుట్పుట్: -1
6. Array.prototype.some()
మరియు Array.prototype.every()
ఈ పద్ధతులు అర్రేలోని అన్ని మూలకాలు అందించిన ఫంక్షన్ ద్వారా అమలు చేయబడిన పరీక్షలో ఉత్తీర్ణత సాధించాయో లేదో పరీక్షిస్తాయి.
some()
: అర్రేలో కనీసం ఒక మూలకం అందించిన పరీక్ష ఫంక్షన్లో ఉత్తీర్ణత సాధించిందో లేదో పరీక్షిస్తుంది. ఇది ఒక బూలియన్ విలువను తిరిగి ఇస్తుంది.every()
: అర్రేలోని అన్ని మూలకాలు అందించిన పరీక్ష ఫంక్షన్లో ఉత్తీర్ణత సాధించాయో లేదో పరీక్షిస్తుంది. ఇది ఒక బూలియన్ విలువను తిరిగి ఇస్తుంది.
ఉదాహరణ: యూజర్ స్థితిని తనిఖీ చేయడం
const users = [
{ id: 1, name: 'Alice', isActive: true },
{ id: 2, name: 'Bob', isActive: false },
{ id: 3, name: 'Charlie', isActive: true }
];
const hasInactiveUser = users.some(user => !user.isActive);
const allAreActive = users.every(user => user.isActive);
console.log(hasInactiveUser); // అవుట్పుట్: true (ఎందుకంటే బాబ్ నిష్క్రియంగా ఉన్నాడు)
console.log(allAreActive); // అవుట్పుట్: false (ఎందుకంటే బాబ్ నిష్క్రియంగా ఉన్నాడు)
const allUsersActive = users.filter(user => user.isActive).length === users.length;
console.log(allUsersActive); // అవుట్పుట్: false
// నేరుగా every ఉపయోగించి ప్రత్యామ్నాయం
const allUsersActiveDirect = users.every(user => user.isActive);
console.log(allUsersActiveDirect); // అవుట్పుట్: false
సంక్లిష్ట కార్యకలాపాల కోసం అర్రే పద్ధతులను చైన్ చేయడం
జావాస్క్రిప్ట్ అర్రేలతో ఫంక్షనల్ ప్రోగ్రామింగ్ యొక్క నిజమైన శక్తి మీరు ఈ పద్ధతులను కలిపి చైన్ చేసినప్పుడు ప్రకాశిస్తుంది. ఈ పద్ధతులలో చాలా వరకు కొత్త అర్రేలను తిరిగి ఇస్తాయి కాబట్టి (forEach
మినహా), మీరు ఒక పద్ధతి యొక్క అవుట్పుట్ను మరొక పద్ధతి యొక్క ఇన్పుట్లోకి సజావుగా పైప్ చేయవచ్చు, సొగసైన మరియు చదవగలిగే డేటా పైప్లైన్లను సృష్టిస్తుంది.
ఉదాహరణ: యాక్టివ్ యూజర్ పేర్లను కనుగొని, వారి ఐడిలను రెట్టింపు చేయడం
అన్ని యాక్టివ్ యూజర్లను కనుగొని, వారి పేర్లను సంగ్రహించి, ఆపై *ఫిల్టర్ చేయబడిన* జాబితాలో ప్రతి పేరుకు దాని ఇండెక్స్ను సూచించే సంఖ్యతో ముందుగా జతచేయబడిన కొత్త అర్రేను సృష్టిద్దాం మరియు వారి ఐడిలు రెట్టింపు చేయబడతాయి.
const users = [
{ id: 1, name: 'Alice', isActive: true },
{ id: 2, name: 'Bob', isActive: false },
{ id: 3, name: 'Charlie', isActive: true },
{ id: 4, name: 'David', isActive: true },
{ id: 5, name: 'Eve', isActive: false }
];
const processedActiveUsers = users
.filter(user => user.isActive) // కేవలం యాక్టివ్ యూజర్లను పొందండి
.map((user, index) => ({ // ప్రతి యాక్టివ్ యూజర్ను మార్చండి
name: `${index + 1}. ${user.name}`,
doubledId: user.id * 2
}));
console.log(processedActiveUsers);
/* అవుట్పుట్:
[
{ name: '1. Alice', doubledId: 2 },
{ name: '2. Charlie', doubledId: 6 },
{ name: '3. David', doubledId: 8 }
]
*/
ఈ చైన్డ్ విధానం డిక్లరేటివ్: మేము స్పష్టమైన లూప్ నిర్వహణ లేకుండా దశలను (ఫిల్టర్, ఆపై మ్యాప్) నిర్దేశిస్తాము. ఇది ఇమ్మ్యూటబుల్ కూడా, ఎందుకంటే ప్రతి దశ ఒక కొత్త అర్రే లేదా ఆబ్జెక్ట్ను ఉత్పత్తి చేస్తుంది, అసలు users
అర్రేను తాకకుండా వదిలివేస్తుంది.
ఆచరణలో ఇమ్మ్యూటబిలిటీ
ఫంక్షనల్ ప్రోగ్రామింగ్ ఇమ్మ్యూటబిలిటీపై ఎక్కువగా ఆధారపడుతుంది. దీని అర్థం ఇప్పటికే ఉన్న డేటా నిర్మాణాలను మార్చే బదులు, మీరు కావలసిన మార్పులతో కొత్త వాటిని సృష్టిస్తారు. జావాస్క్రిప్ట్ యొక్క map
, filter
, మరియు slice
వంటి అర్రే పద్ధతులు కొత్త అర్రేలను తిరిగి ఇవ్వడం ద్వారా దీనికి స్వాభావికంగా మద్దతు ఇస్తాయి.
ఇమ్మ్యూటబిలిటీ ఎందుకు ముఖ్యమైనది?
- ప్రిడిక్టబిలిటీ: షేర్డ్ మ్యూటబుల్ స్టేట్కు మార్పులను ట్రాక్ చేయవలసిన అవసరం లేదు కాబట్టి కోడ్ను అర్థం చేసుకోవడం సులభం అవుతుంది.
- డీబగ్గింగ్: బగ్స్ సంభవించినప్పుడు, డేటా ఊహించని విధంగా మార్చబడనప్పుడు సమస్య యొక్క మూలాన్ని గుర్తించడం సులభం.
- పనితీరు: కొన్ని సందర్భాల్లో (రెడక్స్ లేదా రియాక్ట్ వంటి స్టేట్ మేనేజ్మెంట్ లైబ్రరీలతో), ఇమ్మ్యూటబిలిటీ సమర్థవంతమైన మార్పుల గుర్తింపును అనుమతిస్తుంది.
- కన్కరెన్సీ: ఇమ్మ్యూటబుల్ డేటా నిర్మాణాలు స్వాభావికంగా థ్రెడ్-సేఫ్, కన్కరెంట్ ప్రోగ్రామింగ్ను సులభతరం చేస్తాయి.
మీరు సాంప్రదాయకంగా ఒక అర్రేను మార్చే ఆపరేషన్ (ఒక మూలకాన్ని జోడించడం లేదా తీసివేయడం వంటివి) చేయవలసి వచ్చినప్పుడు, మీరు slice
, స్ప్రెడ్ సింటాక్స్ (...
), లేదా ఇతర ఫంక్షనల్ పద్ధతులను కలపడం ద్వారా ఇమ్మ్యూటబిలిటీని సాధించవచ్చు.
ఉదాహరణ: ఒక మూలకాన్ని ఇమ్మ్యూటబుల్గా జోడించడం
const originalArray = [1, 2, 3];
// ఇంపరేటివ్ విధానం (originalArrayను మారుస్తుంది)
// originalArray.push(4);
// స్ప్రెడ్ సింటాక్స్ ఉపయోగించి ఫంక్షనల్ విధానం
const newArrayWithPush = [...originalArray, 4];
console.log(originalArray); // అవుట్పుట్: [1, 2, 3]
console.log(newArrayWithPush); // అవుట్పుట్: [1, 2, 3, 4]
// స్లైస్ మరియు కాన్కాటినేషన్ ఉపయోగించి ఫంక్షనల్ విధానం (ఇప్పుడు అంత సాధారణం కాదు)
const newArrayWithSlice = originalArray.slice(0, originalArray.length).concat(4);
console.log(newArrayWithSlice); // అవుట్పుట్: [1, 2, 3, 4]
ఉదాహరణ: ఒక మూలకాన్ని ఇమ్మ్యూటబుల్గా తీసివేయడం
const originalArray = [1, 2, 3, 4, 5];
// ఇండెక్స్ 2 వద్ద ఉన్న మూలకాన్ని (విలువ 3) తీసివేయండి
// స్లైస్ మరియు స్ప్రెడ్ సింటాక్స్ ఉపయోగించి ఫంక్షనల్ విధానం
const newArrayAfterSplice = [
...originalArray.slice(0, 2),
...originalArray.slice(3)
];
console.log(originalArray); // అవుట్పుట్: [1, 2, 3, 4, 5]
console.log(newArrayAfterSplice); // అవుట్పుట్: [1, 2, 4, 5]
// ఒక నిర్దిష్ట విలువను తీసివేయడానికి ఫిల్టర్ ఉపయోగించి
const newValueToRemove = 3;
const arrayWithoutValue = originalArray.filter(item => item !== newValueToRemove);
console.log(arrayWithoutValue); // అవుట్పుట్: [1, 2, 4, 5]
ఉత్తమ పద్ధతులు మరియు అధునాతన పద్ధతులు
మీరు ఫంక్షనల్ అర్రే పద్ధతులతో మరింత సౌకర్యవంతంగా మారినప్పుడు, ఈ పద్ధతులను పరిగణించండి:
- చదవడానికి ప్రాధాన్యత: చైనింగ్ శక్తివంతమైనదే అయినప్పటికీ, చాలా పొడవైన చైన్లు చదవడం కష్టం కావచ్చు. సంక్లిష్ట కార్యకలాపాలను చిన్న, పేరున్న ఫంక్షన్లుగా విభజించడం లేదా మధ్యంతర వేరియబుల్స్ను ఉపయోగించడం పరిగణించండి.
reduce
యొక్క ఫ్లెక్సిబిలిటీని అర్థం చేసుకోండి:reduce
కేవలం ఒకే విలువలను మాత్రమే కాకుండా అర్రేలు లేదా ఆబ్జెక్ట్లను కూడా నిర్మించగలదని గుర్తుంచుకోండి. ఇది సంక్లిష్ట రూపాంతరాలకు చాలా బహుముఖంగా చేస్తుంది.- కాల్బ్యాక్లలో సైడ్ ఎఫెక్ట్స్ను నివారించండి: మీ
map
,filter
, మరియుreduce
కాల్బ్యాక్లను ప్యూర్గా ఉంచడానికి ప్రయత్నించండి. మీరు సైడ్ ఎఫెక్ట్స్తో ఒక చర్యను చేయవలసి వస్తే,forEach
తరచుగా మరింత సరైన ఎంపిక. - ఆరో ఫంక్షన్లను ఉపయోగించండి: ఆరో ఫంక్షన్లు (
=>
) కాల్బ్యాక్ ఫంక్షన్లకు సంక్షిప్త సింటాక్స్ను అందిస్తాయి మరియు `this` బైండింగ్ను విభిన్నంగా నిర్వహిస్తాయి, తరచుగా వాటిని ఫంక్షనల్ అర్రే పద్ధతులకు అనువైనవిగా చేస్తాయి. - లైబ్రరీలను పరిగణించండి: మరింత అధునాతన ఫంక్షనల్ ప్రోగ్రామింగ్ ప్యాటర్న్ల కోసం లేదా మీరు ఇమ్మ్యూటబిలిటీతో విస్తృతంగా పనిచేస్తుంటే, Lodash/fp, Ramda, లేదా Immutable.js వంటి లైబ్రరీలు ప్రయోజనకరంగా ఉంటాయి, అయినప్పటికీ ఆధునిక జావాస్క్రిప్ట్లో ఫంక్షనల్ అర్రే ఆపరేషన్లతో ప్రారంభించడానికి అవి ఖచ్చితంగా అవసరం లేదు.
ఉదాహరణ: డేటా అగ్రిగేషన్కు ఫంక్షనల్ విధానం
వివిధ ప్రాంతాల నుండి మీకు అమ్మకాల డేటా ఉందని మరియు ప్రతి ప్రాంతానికి మొత్తం అమ్మకాలను లెక్కించి, ఆపై అత్యధిక అమ్మకాలు ఉన్న ప్రాంతాన్ని కనుగొనాలని ఊహించుకోండి.
const salesData = [
{ region: 'North', amount: 100 },
{ region: 'South', amount: 150 },
{ region: 'North', amount: 120 },
{ region: 'East', amount: 200 },
{ region: 'South', amount: 180 },
{ region: 'North', amount: 90 }
];
// 1. reduce ఉపయోగించి ప్రతి ప్రాంతానికి మొత్తం అమ్మకాలను లెక్కించండి
const salesByRegion = salesData.reduce((acc, sale) => {
acc[sale.region] = (acc[sale.region] || 0) + sale.amount;
return acc;
}, {});
// salesByRegion ఇలా ఉంటుంది: { North: 310, South: 330, East: 200 }
// 2. సమగ్ర ఆబ్జెక్ట్ను తదుపరి ప్రాసెసింగ్ కోసం ఆబ్జెక్ట్ల అర్రేగా మార్చండి
const salesArray = Object.keys(salesByRegion).map(region => ({
region: region,
totalAmount: salesByRegion[region]
}));
// salesArray ఇలా ఉంటుంది: [
// { region: 'North', totalAmount: 310 },
// { region: 'South', totalAmount: 330 },
// { region: 'East', totalAmount: 200 }
// ]
// 3. reduce ఉపయోగించి అత్యధిక అమ్మకాలు ఉన్న ప్రాంతాన్ని కనుగొనండి
const highestSalesRegion = salesArray.reduce((max, current) => {
return current.totalAmount > max.totalAmount ? current : max;
}, { region: '', totalAmount: -Infinity }); // చాలా చిన్న సంఖ్యతో ప్రారంభించండి
console.log('ప్రాంతాల వారీగా అమ్మకాలు:', salesByRegion);
console.log('అమ్మకాల అర్రే:', salesArray);
console.log('అత్యధిక అమ్మకాలు ఉన్న ప్రాంతం:', highestSalesRegion);
/*
అవుట్పుట్:
ప్రాంతాల వారీగా అమ్మకాలు: { North: 310, South: 330, East: 200 }
అమ్మకాల అర్రే: [
{ region: 'North', totalAmount: 310 },
{ region: 'South', totalAmount: 330 },
{ region: 'East', totalAmount: 200 }
]
అత్యధిక అమ్మకాలు ఉన్న ప్రాంతం: { region: 'South', totalAmount: 330 }
*/
ముగింపు
జావాస్క్రిప్ట్ అర్రేలతో ఫంక్షనల్ ప్రోగ్రామింగ్ కేవలం ఒక శైలీకృత ఎంపిక కాదు; ఇది శుభ్రమైన, మరింత ఊహించదగిన, మరియు మరింత బలమైన కోడ్ను వ్రాయడానికి ఒక శక్తివంతమైన మార్గం. map
, filter
, మరియు reduce
వంటి పద్ధతులను స్వీకరించడం ద్వారా, మీరు ఫంక్షనల్ ప్రోగ్రామింగ్ యొక్క ప్రధాన సూత్రాలకు, ముఖ్యంగా ఇమ్మ్యూటబిలిటీ మరియు ప్యూర్ ఫంక్షన్లకు కట్టుబడి ఉంటూ మీ డేటాను సమర్థవంతంగా మార్చవచ్చు, ప్రశ్నించవచ్చు మరియు సమగ్రపరచవచ్చు.
మీరు జావాస్క్రిప్ట్ డెవలప్మెంట్లో మీ ప్రయాణాన్ని కొనసాగిస్తున్నప్పుడు, ఈ ఫంక్షనల్ ప్యాటర్న్లను మీ రోజువారీ వర్క్ఫ్లోలో ఏకీకృతం చేయడం నిస్సందేహంగా మరింత నిర్వహించదగిన మరియు స్కేలబుల్ అప్లికేషన్లకు దారితీస్తుంది. మీ ప్రాజెక్ట్లలో ఈ అర్రే పద్ధతులతో ప్రయోగాలు చేయడం ప్రారంభించండి, మరియు మీరు త్వరలోనే వాటి అపారమైన విలువను కనుగొంటారు.