टीएल; डीआर, प्रारंभिक मूल्य निर्धारित करें
विनाशकारी का उपयोग करना
arr.reduce( ( sum, { x } ) => sum + x , 0)
बिना विनाश के
arr.reduce( ( sum , cur ) => sum + cur.x , 0)
टाइपस्क्रिप्ट के साथ
arr.reduce( ( sum, { x } : { x: number } ) => sum + x , 0)
चलो विनाशकारी विधि का प्रयास करें:
const arr = [ { x: 1 }, { x: 2 }, { x: 4 } ]
const result = arr.reduce( ( sum, { x } ) => sum + x , 0)
console.log( result ) // 7
इसकी कुंजी प्रारंभिक मूल्य निर्धारित कर रही है। वापसी मूल्य अगले पुनरावृत्ति का पहला पैरामीटर बन जाता है।
शीर्ष उत्तर में प्रयुक्त तकनीक मुहावरेदार नहीं है
स्वीकृत उत्तर "वैकल्पिक" मान को पारित नहीं करने का प्रस्ताव करता है। यह गलत है, क्योंकि मुहावरेदार तरीका यह है कि दूसरे पैरामीटर को हमेशा शामिल किया जाए। क्यों? तीन कारण:
1. खतरनाक
- प्रारंभिक मूल्य में नहीं गुजरना खतरनाक है और कॉलबैक फ़ंक्शन लापरवाह होने पर दुष्प्रभाव और उत्परिवर्तन पैदा कर सकते हैं।
देखो
const badCallback = (a,i) => Object.assign(a,i)
const foo = [ { a: 1 }, { b: 2 }, { c: 3 } ]
const bar = foo.reduce( badCallback ) // bad use of Object.assign
// Look, we've tampered with the original array
foo // [ { a: 1, b: 2, c: 3 }, { b: 2 }, { c: 3 } ]
हालांकि अगर हमने प्रारंभिक मूल्य के साथ इसे इस तरह से किया है:
const bar = foo.reduce( badCallback, {})
// foo is still OK
foo // { a: 1, b: 2, c: 3 }
रिकॉर्ड के लिए, जब तक आप मूल ऑब्जेक्ट को म्यूट करने का इरादा न करें, Object.assignकिसी खाली ऑब्जेक्ट के पहले पैरामीटर को सेट करें । इस तरह Object.assign({}, a, b, c):।
2 - बेहतर प्रकार
का आविष्कार - जब टाइपस्क्रिप्ट या वीएस कोड जैसे संपादक के उपकरण का उपयोग किया जाता है, तो आपको कंपाइलर को प्रारंभिक बताने का लाभ मिलता है और यदि आप इसे गलत कर रहे हैं तो यह त्रुटियों को पकड़ सकता है। यदि आप प्रारंभिक मूल्य निर्धारित नहीं करते हैं, तो कई स्थितियों में यह अनुमान लगाने में सक्षम नहीं हो सकता है और आप खौफनाक रनटाइम त्रुटियों के साथ समाप्त हो सकते हैं।
3 - फनर्स का सम्मान करें
- जब उसके अंदर का कार्यात्मक बच्चा सामने आता है तो जावास्क्रिप्ट सबसे अच्छा चमकता है। कार्यात्मक दुनिया में, एक मानक है कि आप "तह" या reduceएक सरणी कैसे बनाते हैं । जब आप ऐरे में कैटमोफिज्म को मोड़ते या लगाते हैं , तो आप एक नए प्रकार का निर्माण करने के लिए उस एरे के मूल्यों को लेते हैं। आपको परिणामी प्रकार को संवाद करने की आवश्यकता है - आपको यह करना चाहिए भले ही अंतिम प्रकार सरणी में मानों का हो, किसी अन्य सरणी, या किसी अन्य प्रकार का।
आइए इसके बारे में दूसरे तरीके से सोचते हैं। जावास्क्रिप्ट में, फ़ंक्शन को डेटा की तरह पास किया जा सकता है, यह है कि कॉलबैक कैसे काम करता है, निम्नलिखित कोड का परिणाम क्या है?
[1,2,3].reduce(callback)
क्या यह एक नंबर लौटाएगा? एक वस्तु? इससे यह साफ हो जाता है
[1,2,3].reduce(callback,0)
कार्यात्मक प्रोग्रामिंग कल्पना पर और अधिक पढ़ें: https://github.com/fantasyland/fantasy-land#foldable
कुछ और पृष्ठभूमि
reduceविधि दो पैरामीटर लेता है,
Array.prototype.reduce( callback, initialItem )
callbackसमारोह निम्नलिखित मानकों लेता है
(accumulator, itemInArray, indexInArray, entireArray) => { /* do stuff */ }
पहली पुनरावृत्ति के लिए,
यदि initialItemप्रदान किया जाता है, तो reduceफ़ंक्शन सरणी के पहले और आइटम के initialItemरूप में गुजरता accumulatorहै itemInArray।
तो initialItemहै नहीं प्रदान की, reduceसमारोह के रूप में सरणी में पहला आइटम गुजरता है initialItemऔर सरणी के रूप में में दूसरे मद itemInArrayजो व्यवहार भ्रमित किया जा सकता है।
मैं सिखाता हूं और हमेशा कम करने के प्रारंभिक मूल्य को निर्धारित करने की सलाह देता हूं।
आप यहाँ पर दस्तावेज़ देख सकते हैं:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
उम्मीद है की यह मदद करेगा!
arr.reduce(function(a,b){return a + b})दूसरे उदाहरण में मतलब है।