টিএল; ডিআর, প্রাথমিক মান নির্ধারণ করুন
ধ্বংসাত্মক ব্যবহার করে
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
এটির মূলটি প্রাথমিক মান সেট করে setting রিটার্ন মান পরবর্তী পুনরাবৃত্তির প্রথম প্যারামিটারে পরিণত হয়।
শীর্ষ উত্তরে ব্যবহৃত প্রযুক্তিটি মুশকিল নয়
গৃহীত উত্তরটি "alচ্ছিক" মানটি পাস না করার প্রস্তাব দেয়। এটি ভুল, কারণ মূর্খতাপূর্ণ উপায় হ'ল দ্বিতীয় প্যারামিটারটি সর্বদা অন্তর্ভুক্ত থাকে। কেন? তিনটি কারণ:
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})দ্বিতীয় উদাহরণটিতে বোঝাতে চাইছেন ।