এই উত্তরটি লেখার দ্বারা অনুপ্রাণিত হয়ে, আমি পরে প্রসারিত এবং সাবধানতার সাথে বিস্তারিতভাবে এই ব্লগ পোস্ট লিখে শেষ করেছি। আপনি যদি এই সমস্যাটি সম্পর্কে কীভাবে চিন্তাভাবনা করতে চান তার আরও গভীর বোধ বিকাশ করতে চান তবে আমি এটি পরীক্ষা করে দেখার পরামর্শ দিচ্ছি - আমি এটিকে টুকরো টুকরো করে ব্যাখ্যা করার চেষ্টা করি, এবং গতি বিবেচনার পরেও জেএসপারফ তুলনা করি।
এটি বলেছিল, টিএল; ডাঃ এটি: আপনি যা চেয়েছেন তা সম্পাদন করতে (এক ফাংশন কলের মধ্যে ফিল্টারিং এবং ম্যাপিং), আপনি ব্যবহার করবেনArray.reduce()
।
তবে, আরও পঠনযোগ্য এবং (কম গুরুত্বপূর্ণভাবে) সাধারণত উল্লেখযোগ্যভাবে দ্রুত 2 পদ্ধতির মধ্যে রয়েছে কেবল ফিল্টার এবং মানচিত্রকে এক সাথে বেঁধে রাখা:
[1,2,3].filter(num => num > 2).map(num => num * 2)
নিম্নলিখিতটি কীভাবে Array.reduce()
কাজ করে তার বর্ণনা এবং এটি কীভাবে এক পুনরাবৃত্তিতে ফিল্টার এবং মানচিত্র সম্পাদন করতে ব্যবহার করা যেতে পারে is আবার, যদি এটি খুব ঘনীভূত হয় তবে আমি উপরের লিঙ্কযুক্ত ব্লগ পোস্টটি দেখার জন্য অত্যন্ত পরামর্শ দিচ্ছি, এটি স্পষ্ট উদাহরণ এবং অগ্রগতির সাথে অনেক বেশি বন্ধুত্বপূর্ণ পরিচয়।
আপনি একটি যুক্তি হ্রাস করুন যা একটি (সাধারণত বেনামে) ফাংশন।
সেই বেনামি ফাংশনটি দুটি পরামিতি নেয় - একটি (মানচিত্র / ফিল্টার / forEach এ অজ্ঞাতনামা ফাংশনগুলির মত) চালিত হওয়া পুনরুক্তি। বেনামে ফাংশনটি হ্রাস করতে পাস করার জন্য আরও একটি যুক্তি রয়েছে, তবে those ফাংশনগুলি গ্রহণ করে না, এবং এটি সেই মান যা ফাংশন কলগুলির মধ্যে পাশ করা হবে, প্রায়শই মেমো হিসাবে পরিচিত ।
নোট করুন যে অ্যারে.ফিল্টার () শুধুমাত্র একটি যুক্তি (একটি ফাংশন) নিলে, অ্যারে.রেডুস () এছাড়াও একটি গুরুত্বপূর্ণ (যদিও alচ্ছিক) দ্বিতীয় যুক্তি গ্রহণ করে: 'মেমো' এর জন্য একটি প্রাথমিক মান যা সেই বেনামে ফাংশনে চলে যাবে প্রথম যুক্তি, এবং পরবর্তীকালে ফাংশন কলগুলির মধ্যে রূপান্তরিত এবং পাশ করা যায়। (যদি এটি সরবরাহ না করা হয়, তবে প্রথম বেনাম ফাংশন কলের 'মেমো' ডিফল্টরূপে প্রথম পুনরাবৃত্ত হবে এবং 'পুনরাবৃত্তি' যুক্তিটি অ্যারেতে দ্বিতীয় মান হবে)
আমাদের ক্ষেত্রে, আমরা শুরু করতে একটি খালি অ্যারে পাস করব, এবং তারপরে আমাদের পুনরাবৃত্তিকে আমাদের অ্যারেতে ইনজেক্ট করতে হবে বা আমাদের ফাংশনের উপর ভিত্তি করে নয় তা বেছে নেব - এটি ফিল্টারিং প্রক্রিয়া।
অবশেষে, আমরা প্রতিটি বেনামে ফাংশন কলটিতে আমাদের 'অ্যারে প্রগতিতে' ফিরিয়ে দেব এবং হ্রাসটি সেই রিটার্নের মানটি গ্রহণ করবে এবং এটিকে তার পরবর্তী ফাংশন কলটিতে একটি আর্গুমেন্ট (মেমো বলে) হিসাবে প্রদান করবে।
এটি ফিল্টার এবং মানচিত্রকে এক পুনরাবৃত্তিতে ঘটতে দেয়, আমাদের প্রয়োজনীয় পুনরাবৃত্তির অর্ধেক অংশ কেটে দেয় - প্রতিটি পুনরাবৃত্তির দ্বিগুণ কাজ করে যদিও, জাভাস্ক্রিপ্টে এত ব্যয়বহুল নয় এমন ফাংশন কল ব্যতীত অন্য কিছুই সংরক্ষণ করা যায় না which ।
আরও সম্পূর্ণ ব্যাখ্যার জন্য, MDN ডক্স (বা এই উত্তরটির শুরুতে উল্লেখ করা আমার পোস্টে) দেখুন।
হ্রাস কলের মূল উদাহরণ:
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;
}
প্রকৃত বাস্তবায়ন সূচকের মতো জিনিসগুলিতে অ্যাক্সেসের অনুমতি দেয়, উদাহরণস্বরূপ, তবে আমি আশা করি এটি আপনাকে এর সংক্ষিপ্তসার জন্য একটি জটিল জটিলতা পেতে সহায়তা করবে।