इस उत्तर को लिखने से प्रेरित होकर, मैंने बाद में विस्तार किया और एक ब्लॉग पोस्ट लिखी जो इस पर सावधानीपूर्वक विस्तार से लिख रहा था। मैं यह जांचने की सलाह देता हूं कि यदि आप इस समस्या के बारे में कैसे सोचना चाहते हैं, तो इसकी गहरी समझ विकसित करना चाहते हैं - मैं कोशिश करता हूं कि इसे टुकड़ा द्वारा समझाया जाए, और अंत में जेस्परफ की तुलना भी की जाए।
उस ने कहा, टीएल? डॉ। यह है: यह पूरा करने के लिए कि आप क्या पूछ रहे हैं (एक फ़ंक्शन कॉल के भीतर फ़िल्टरिंग और मैपिंग), आप उपयोग करेंगेArray.reduce()
।
हालांकि, अधिक पठनीय और (कम महत्वपूर्ण) आमतौर पर काफी तेजी से 2 दृष्टिकोण सिर्फ फिल्टर और मानचित्र का उपयोग एक साथ करने के लिए है:
[1,2,3].filter(num => num > 2).map(num => num * 2)
निम्नलिखित इस बात का विवरण है कि कैसे Array.reduce()
काम करता है, और इसका उपयोग एक पुनरावृत्ति में फ़िल्टर और मानचित्र को पूरा करने के लिए कैसे किया जा सकता है। फिर से, अगर यह बहुत संघटित है, तो मैं ऊपर दिए गए ब्लॉग पोस्ट को देखने की अत्यधिक सलाह देता हूं, जो स्पष्ट उदाहरणों और प्रगति के साथ बहुत अधिक अनुकूल परिचय है।
आप एक तर्क को कम करते हैं जो एक (आमतौर पर अनाम) फ़ंक्शन है।
वह अनाम फ़ंक्शन दो मापदंडों को लेता है - एक (जैसे मानचित्र / फ़िल्टर / forEach में पारित किए गए अनाम फ़ंक्शन) पर संचालित होने के लिए पुनरावृति है। अनाम फ़ंक्शन को कम करने के लिए पारित एक और तर्क है, हालांकि, उन कार्यों को स्वीकार नहीं करते हैं, और यह वह फ़ंक्शन है जिसे फ़ंक्शन कॉल के बीच पारित किया जाएगा, जिसे अक्सर मेमो के रूप में संदर्भित किया जाता है ।
ध्यान दें कि जबकि Array.filter () केवल एक तर्क (एक फ़ंक्शन) लेता है, Array.reduce () भी एक महत्वपूर्ण (हालांकि वैकल्पिक) दूसरा तर्क लेता है: 'ज्ञापन' के लिए एक प्रारंभिक मान जिसे उस अनाम फ़ंक्शन में पारित किया जाएगा पहले तर्क, और बाद में फ़ंक्शन कॉल के बीच उत्परिवर्तित और पारित किया जा सकता है। (यदि इसकी आपूर्ति नहीं की जाती है, तो पहले अनाम फ़ंक्शन कॉल में 'मेमो' डिफ़ॉल्ट रूप से पहला पुनरावृति होगा, और 'पुनरावृति' तर्क वास्तव में सरणी में दूसरा मान होगा)
हमारे मामले में, हम शुरू करने के लिए एक खाली सरणी में पास करेंगे, और फिर चुनें कि क्या हमारे सरणी को हमारे सरणी में इंजेक्ट करना है या हमारे कार्य के आधार पर नहीं - यह फ़िल्टरिंग प्रक्रिया है।
अंत में, हम प्रत्येक अनाम फ़ंक्शन कॉल पर अपना 'एरेन्ज इन प्रोग्रेस' लौटाएँगे, और घटाएँ उस रिटर्न वैल्यू को ले जाएँगे और इसे अपने अगले फंक्शन कॉल के लिए एक तर्क (मेमो कहा जाता है) के रूप में पास करेंगे।
यह फ़िल्टर और मैप को एक पुनरावृत्ति में होने देता है, हमारी आवश्यक पुनरावृत्तियों की संख्या को आधे में काट देता है - बस दो बार प्रत्येक पुनरावृत्ति के रूप में अधिक काम करता है, हालांकि, फ़ंक्शन कॉल के अलावा वास्तव में कुछ भी नहीं बचाया जाता है, जो जावास्क्रिप्ट में इतना महंगा नहीं है ।
अधिक पूर्ण स्पष्टीकरण के लिए, एमडीएन डॉक्स (या इस उत्तर की शुरुआत में संदर्भित मेरी पोस्ट) देखें।
मूल कमी का उदाहरण:
let array = [1,2,3];
const initialMemo = [];
array = array.reduce((memo, iteratee) => {
if (iteratee > 1) {
memo.push(iteratee * 2);
}
return memo;
}, initialMemo)
console.log(array)
अधिक रसीला संस्करण:
[1,2,3].reduce((memo, value) => value > 1 ? memo.concat(value * 2) : memo, [])
ध्यान दें कि पहला पुनरावृति एक से अधिक नहीं था, और इसलिए फ़िल्टर किया गया था। प्रारंभिक अस्तित्व पर भी ध्यान दें, जिसका नाम केवल उसके अस्तित्व को स्पष्ट करने और उस पर ध्यान आकर्षित करने के लिए है। एक बार फिर, इसे पहले अनाम फ़ंक्शन कॉल के लिए 'ज्ञापन' के रूप में पारित किया जाता है, और फिर अनाम फ़ंक्शन के दिए गए मान को अगले फ़ंक्शन के लिए 'ज्ञापन' तर्क के रूप में पारित किया जाता है।
मेमो के लिए क्लासिक उपयोग के मामले का एक और उदाहरण एक सरणी में सबसे छोटी या सबसे बड़ी संख्या को वापस करना होगा। उदाहरण:
[7,4,1,99,57,2,1,100].reduce((memo, val) => memo > val ? memo : val)
अपने स्वयं के कम करने के कार्य को लिखने का एक उदाहरण (यह अक्सर इन जैसे कार्यों को समझने में मदद करता है, मुझे लगता है):
test_arr = [];
test_arr.my_reducer = function(reduceFunc, initialMemo) {
const initialMemoIsIndexZero = arguments.length < 2;
let memo = initialMemoIsIndexZero ? this[0] : initialMemo;
const initialIteratee = initialMemoIsIndexZero ? 1 : 0;
for (var i = initialIteratee; i < this.length; i++) {
memo = reduceFunc(memo, this[i]);
}
return memo;
}
वास्तविक कार्यान्वयन उदाहरण के लिए, अनुक्रमणिका जैसी चीज़ों तक पहुंच की अनुमति देता है, लेकिन मुझे आशा है कि इससे आपको इस बात का पता लगाने में मदद मिलेगी।