ജാവാസ്ക്രിപ്റ്റ് അറേകളുടെ ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് ശക്തി പ്രയോജനപ്പെടുത്തുക. ബിൽറ്റ്-ഇൻ മെത്തേഡുകൾ ഉപയോഗിച്ച് നിങ്ങളുടെ ഡാറ്റ കാര്യക്ഷമമായി രൂപാന്തരപ്പെടുത്താനും ഫിൽട്ടർ ചെയ്യാനും റെഡ്യൂസ് ചെയ്യാനും പഠിക്കുക.
ജാവാസ്ക്രിപ്റ്റ് അറേകൾ ഉപയോഗിച്ച് ഫങ്ഷണൽ പ്രോഗ്രാമിംഗിൽ വൈദഗ്ദ്ധ്യം നേടാം
വെബ് ഡെവലപ്മെൻ്റിൻ്റെ എപ്പോഴും വികസിച്ചുകൊണ്ടിരിക്കുന്ന ലോകത്ത് ജാവാസ്ക്രിപ്റ്റ് ഒരു സുപ്രധാന ഘടകമായി തുടരുന്നു. ഒബ്ജക്റ്റ്-ഓറിയൻ്റഡ്, ഇംപറേറ്റീവ് പ്രോഗ്രാമിംഗ് രീതികൾ വളരെക്കാലമായി പ്രബലമാണെങ്കിലും, ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് (FP) കാര്യമായ പ്രചാരം നേടുന്നു. FP ഇമ്മ്യൂട്ടബിലിറ്റി, പ്യുവർ ഫംഗ്ഷനുകൾ, ഡിക്ലറേറ്റീവ് കോഡ് എന്നിവയ്ക്ക് ഊന്നൽ നൽകുന്നു, ഇത് കൂടുതൽ കരുത്തുറ്റതും പരിപാലിക്കാൻ എളുപ്പമുള്ളതും പ്രവചിക്കാവുന്നതുമായ ആപ്ലിക്കേഷനുകളിലേക്ക് നയിക്കുന്നു. ജാവാസ്ക്രിപ്റ്റിൽ ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് സ്വീകരിക്കുന്നതിനുള്ള ഏറ്റവും ശക്തമായ മാർഗ്ഗങ്ങളിലൊന്ന് അതിൻ്റെ നേറ്റീവ് അറേ മെത്തേഡുകൾ പ്രയോജനപ്പെടുത്തുക എന്നതാണ്.
ഈ സമഗ്രമായ ഗൈഡ്, ജാവാസ്ക്രിപ്റ്റ് അറേകൾ ഉപയോഗിച്ച് ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് തത്വങ്ങളുടെ ശക്തി എങ്ങനെ പ്രയോജനപ്പെടുത്താം എന്ന് വിശദീകരിക്കും. ഞങ്ങൾ പ്രധാന ആശയങ്ങൾ പര്യവേക്ഷണം ചെയ്യുകയും map
, filter
, reduce
പോലുള്ള മെത്തേഡുകൾ ഉപയോഗിച്ച് അവ എങ്ങനെ പ്രയോഗിക്കാമെന്ന് കാണിക്കുകയും ചെയ്യും, ഇത് നിങ്ങൾ ഡാറ്റ കൈകാര്യം ചെയ്യുന്ന രീതിയെ മാറ്റും.
എന്താണ് ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ്?
ജാവാസ്ക്രിപ്റ്റ് അറേകളെക്കുറിച്ച് വിശദീകരിക്കുന്നതിന് മുമ്പ്, ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് എന്താണെന്ന് ചുരുക്കത്തിൽ നിർവചിക്കാം. അതിൻ്റെ കാതൽ, FP എന്നത് ഗണിതശാസ്ത്രപരമായ ഫംഗ്ഷനുകളുടെ മൂല്യനിർണ്ണയമായി കണക്കുകൂട്ടലിനെ പരിഗണിക്കുന്ന ഒരു പ്രോഗ്രാമിംഗ് രീതിയാണ്, കൂടാതെ സ്റ്റേറ്റ് മാറ്റുന്നതും മ്യൂട്ടബിൾ ഡാറ്റയും ഒഴിവാക്കുന്നു. പ്രധാന തത്വങ്ങളിൽ ഇവ ഉൾപ്പെടുന്നു:
- പ്യുവർ ഫംഗ്ഷനുകൾ: ഒരു പ്യുവർ ഫംഗ്ഷൻ ഒരേ ഇൻപുട്ടിന് എല്ലായ്പ്പോഴും ഒരേ ഔട്ട്പുട്ട് നൽകുന്നു, ഇതിന് സൈഡ് എഫക്റ്റുകൾ ഒന്നുമില്ല (ഇത് ബാഹ്യ സ്റ്റേറ്റ് മാറ്റുന്നില്ല).
- ഇമ്മ്യൂട്ടബിലിറ്റി: ഡാറ്റ ഒരിക്കൽ ഉണ്ടാക്കിയാൽ പിന്നീട് മാറ്റാൻ കഴിയില്ല. നിലവിലുള്ള ഡാറ്റ മാറ്റുന്നതിന് പകരം, ആവശ്യമുള്ള മാറ്റങ്ങളോടെ പുതിയ ഡാറ്റ സൃഷ്ടിക്കുന്നു.
- ഫസ്റ്റ്-ക്ലാസ് ഫംഗ്ഷനുകൾ: ഫംഗ്ഷനുകളെ മറ്റേതൊരു വേരിയബിളിനെയും പോലെ പരിഗണിക്കാം - അവയെ വേരിയബിളുകളിലേക്ക് അസൈൻ ചെയ്യാം, മറ്റ് ഫംഗ്ഷനുകളിലേക്ക് ആർഗ്യുമെൻ്റായി നൽകാം, ഫംഗ്ഷനുകളിൽ നിന്ന് റിട്ടേൺ ചെയ്യാം.
- ഡിക്ലറേറ്റീവ് വേഴ്സസ് ഇംപറേറ്റീവ്: ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് ഡിക്ലറേറ്റീവ് ശൈലിയിലേക്കാണ് ചായുന്നത്, അവിടെ നിങ്ങൾ എന്ത് നേടണമെന്ന് വിവരിക്കുന്നു, അത് എങ്ങനെ ഘട്ടം ഘട്ടമായി നേടണമെന്ന് വിശദീകരിക്കുന്ന ഇംപറേറ്റീവ് ശൈലിയല്ല.
ഈ തത്വങ്ങൾ സ്വീകരിക്കുന്നത്, പ്രത്യേകിച്ച് സങ്കീർണ്ണമായ ആപ്ലിക്കേഷനുകളിൽ, ചിന്തിക്കാനും പരിശോധിക്കാനും ഡീബഗ് ചെയ്യാനും എളുപ്പമുള്ള കോഡിലേക്ക് നയിക്കും. ജാവാസ്ക്രിപ്റ്റിൻ്റെ അറേ മെത്തേഡുകൾ ഈ ആശയങ്ങൾ നടപ്പിലാക്കാൻ തികച്ചും അനുയോജ്യമാണ്.
ജാവാസ്ക്രിപ്റ്റ് അറേ മെത്തേഡുകളുടെ ശക്തി
ജാവാസ്ക്രിപ്റ്റ് അറേകളിൽ പരമ്പരാഗത ലൂപ്പുകൾ (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]
// slice, concatenation ഉപയോഗിച്ച് ഫങ്ഷണൽ രീതി (ഇപ്പോൾ അത്ര സാധാരണമല്ല)
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) നീക്കം ചെയ്യുക
// slice, സ്പ്രെഡ് സിൻ്റാക്സ് ഉപയോഗിച്ച് ഫങ്ഷണൽ രീതി
const newArrayAfterSplice = [
...originalArray.slice(0, 2),
...originalArray.slice(3)
];
console.log(originalArray); // ഔട്ട്പുട്ട്: [1, 2, 3, 4, 5]
console.log(newArrayAfterSplice); // ഔട്ട്പുട്ട്: [1, 2, 4, 5]
// ഒരു പ്രത്യേക മൂല്യം നീക്കം ചെയ്യാൻ filter ഉപയോഗിക്കുന്നു
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('Sales by Region:', salesByRegion);
console.log('Sales Array:', salesArray);
console.log('Region with Highest Sales:', highestSalesRegion);
/*
ഔട്ട്പുട്ട്:
Sales by Region: { North: 310, South: 330, East: 200 }
Sales Array: [
{ region: 'North', totalAmount: 310 },
{ region: 'South', totalAmount: 330 },
{ region: 'East', totalAmount: 200 }
]
Region with Highest Sales: { region: 'South', totalAmount: 330 }
*/
ഉപസംഹാരം
ജാവാസ്ക്രിപ്റ്റ് അറേകളുമായുള്ള ഫങ്ഷണൽ പ്രോഗ്രാമിംഗ് ഒരു ശൈലിപരമായ തിരഞ്ഞെടുപ്പ് മാത്രമല്ല; ഇത് വൃത്തിയുള്ളതും കൂടുതൽ പ്രവചനാത്മകവും കരുത്തുറ്റതുമായ കോഡ് എഴുതുന്നതിനുള്ള ഒരു ശക്തമായ മാർഗ്ഗമാണ്. map
, filter
, reduce
പോലുള്ള മെത്തേഡുകൾ സ്വീകരിക്കുന്നതിലൂടെ, ഫങ്ഷണൽ പ്രോഗ്രാമിംഗിൻ്റെ പ്രധാന തത്വങ്ങളായ ഇമ്മ്യൂട്ടബിലിറ്റിയും പ്യുവർ ഫംഗ്ഷനുകളും പാലിച്ചുകൊണ്ട് നിങ്ങളുടെ ഡാറ്റയെ കാര്യക്ഷമമായി രൂപാന്തരപ്പെടുത്താനും ചോദ്യം ചെയ്യാനും സംഗ്രഹിക്കാനും കഴിയും.
ജാവാസ്ക്രിപ്റ്റ് ഡെവലപ്മെൻ്റിലെ നിങ്ങളുടെ യാത്ര തുടരുമ്പോൾ, ഈ ഫങ്ഷണൽ പാറ്റേണുകൾ നിങ്ങളുടെ ദൈനംദിന വർക്ക്ഫ്ലോയിൽ സംയോജിപ്പിക്കുന്നത് തീർച്ചയായും കൂടുതൽ പരിപാലിക്കാൻ കഴിയുന്നതും സ്കെയിലബിൾ ആയതുമായ ആപ്ലിക്കേഷനുകളിലേക്ക് നയിക്കും. നിങ്ങളുടെ പ്രോജക്റ്റുകളിൽ ഈ അറേ മെത്തേഡുകൾ ഉപയോഗിച്ച് പരീക്ഷിക്കാൻ ആരംഭിക്കുക, അവയുടെ വലിയ മൂല്യം നിങ്ങൾ ഉടൻ കണ്ടെത്തും.