Underscore.js কি?
Underscore.js একটি JavaScript লাইব্রেরি যা ফাংশনাল প্রোগ্রামিং স্টাইল এবং সহায়ক ইউটিলিটি ফাংশন প্রদান করে। এটি সাধারণত অ্যারে, অবজেক্ট এবং ফাংশনগুলির উপর কাজ করার জন্য ব্যবহৃত হয়, এবং তার অনেকগুলো মেথড প্রোগ্রামিংয়ের কার্যকরীতা বাড়ানোর জন্য ডিজাইন করা হয়েছে। Underscore.js সিঙ্ক্রোনাস অপারেশন এবং ডাটা ম্যানিপুলেশনকে আরও সহজ করে তোলে।
এটি অ্যারে এবং অবজেক্টের সাথে কাজ করার জন্য অনেক শক্তিশালী ফাংশন সরবরাহ করে, এবং এই ফাংশনগুলির মাধ্যমে আপনি আপনার কোডের জটিলতা কমিয়ে আনার চেষ্টা করতে পারেন। এখানে Collection Functions এর ব্যবহার সম্পর্কে আলোচনা করা হবে।
Collection Functions কি?
Collection Functions হল Underscore.js এর একটি গ্রুপ যা আপনাকে অ্যারে, অবজেক্ট বা ফাংশনগুলির উপর অপারেশন কার্যকর করতে সহায়তা করে। এই ফাংশনগুলো বিশেষভাবে ডাটা সংগ্রহের উপরে কাজ করে, যেমন অ্যারে বা অবজেক্টের প্রতিটি উপাদানের জন্য ফাংশন প্রয়োগ করা, ফিল্টার করা, ম্যাপিং করা ইত্যাদি।
Underscore.js-এর Collection Functions ব্যবহার করলে, আপনি for loops এর বদলে আরও সংক্ষিপ্ত এবং কার্যকর কোড লিখতে পারেন।
Collection Functions এর প্রধান ফাংশনসমূহ
১. each
each ফাংশনটি একটি অ্যারে বা অবজেক্টের প্রতিটি উপাদানের উপর একটি নির্দিষ্ট ফাংশন প্রয়োগ করতে ব্যবহৃত হয়। এটি জাভাস্ক্রিপ্টের forEach এর মতো, তবে একটি পার্থক্য হল এটি অ্যারে এবং অবজেক্ট উভয়ের উপর কাজ করতে সক্ষম।
সিনট্যাক্স:
_.each(collection, iteratee, [context]);
collection: অ্যারে বা অবজেক্ট।iteratee: প্রতি উপাদানে যেটি ফাংশন প্রয়োগ হবে।[context]: অপশনাল, যেটি ফাংশনেরthisকনটেক্সট নির্ধারণ করে।
উদাহরণ:
let arr = [1, 2, 3, 4];
_.each(arr, function(value) {
console.log(value * 2);
});
আউটপুট:
2
4
6
8
২. map
map ফাংশনটি একটি নতুন অ্যারে তৈরি করে, যেখানে প্রত্যেকটি উপাদানকে একটি নির্দিষ্ট ফাংশন দিয়ে প্রক্রিয়া করা হয়। এটি জাভাস্ক্রিপ্টের map() ফাংশনের মতো কাজ করে, কিন্তু অ্যারে বা অবজেক্টের উপরে কাজ করতে সক্ষম।
সিনট্যাক্স:
_.map(collection, iteratee, [context]);
collection: অ্যারে বা অবজেক্ট।iteratee: প্রতি উপাদানে যেটি ফাংশন প্রয়োগ হবে।[context]: অপশনাল, যেটি ফাংশনেরthisকনটেক্সট নির্ধারণ করে।
উদাহরণ:
let arr = [1, 2, 3, 4];
let doubled = _.map(arr, function(num) {
return num * 2;
});
console.log(doubled);
আউটপুট:
[2, 4, 6, 8]
৩. filter
filter ফাংশনটি একটি নতুন অ্যারে তৈরি করে, যা কেবলমাত্র সেই উপাদানগুলি ধারণ করে যেগুলি একটি নির্দিষ্ট শর্ত পূর্ণ করে। এটি for লুপের বিকল্প হিসেবে ব্যবহৃত হয়, যা নির্দিষ্ট শর্তে উপাদানগুলিকে ফিল্টার করে।
সিনট্যাক্স:
_.filter(collection, predicate, [context]);
collection: অ্যারে বা অবজেক্ট।predicate: একটি ফাংশন যা শর্ত নির্ধারণ করে।[context]: অপশনাল, যেটি ফাংশনেরthisকনটেক্সট নির্ধারণ করে।
উদাহরণ:
let arr = [1, 2, 3, 4, 5];
let evenNumbers = _.filter(arr, function(num) {
return num % 2 === 0;
});
console.log(evenNumbers);
আউটপুট:
[2, 4]
৪. reduce
reduce ফাংশনটি একটি একক মান উৎপন্ন করে, যেটি অ্যারে বা অবজেক্টের সকল উপাদানের উপর একটি নির্দিষ্ট ফাংশন প্রয়োগের মাধ্যমে পাওয়া যায়। এটি অ্যারের সমস্ত উপাদানকে একত্রিত (accumulate) করে।
সিনট্যাক্স:
_.reduce(collection, iteratee, [memo], [context]);
collection: অ্যারে বা অবজেক্ট।iteratee: একটি ফাংশন যা অ্যারে বা অবজেক্টের উপাদানগুলির উপর প্রয়োগ হবে।[memo]: প্রাথমিক মান (অপশনাল)।[context]: অপশনাল, যেটি ফাংশনেরthisকনটেক্সট নির্ধারণ করে।
উদাহরণ:
let arr = [1, 2, 3, 4];
let sum = _.reduce(arr, function(total, num) {
return total + num;
}, 0);
console.log(sum);
আউটপুট:
10
৫. find
find ফাংশনটি অ্যারে বা অবজেক্টের মধ্যে একটি উপাদান খুঁজে বের করে যা একটি নির্দিষ্ট শর্ত পূর্ণ করে এবং সেই প্রথম উপাদানটি রিটার্ন করে।
সিনট্যাক্স:
_.find(collection, predicate, [context]);
collection: অ্যারে বা অবজেক্ট।predicate: একটি ফাংশন যা শর্ত নির্ধারণ করে।[context]: অপশনাল, যেটি ফাংশনেরthisকনটেক্সট নির্ধারণ করে।
উদাহরণ:
let arr = [5, 12, 8, 130, 44];
let found = _.find(arr, function(num) {
return num > 10;
});
console.log(found);
আউটপুট:
12
৬. every
every ফাংশনটি একটি অ্যারে বা অবজেক্টের সমস্ত উপাদান পরীক্ষা করে, এবং যদি সব উপাদান একটি নির্দিষ্ট শর্ত পূর্ণ করে তবে true রিটার্ন করে, অন্যথায় false রিটার্ন করে।
সিনট্যাক্স:
_.every(collection, predicate, [context]);
collection: অ্যারে বা অবজেক্ট।predicate: একটি ফাংশন যা শর্ত নির্ধারণ করে।[context]: অপশনাল, যেটি ফাংশনেরthisকনটেক্সট নির্ধারণ করে।
উদাহরণ:
let arr = [2, 4, 6, 8];
let allEven = _.every(arr, function(num) {
return num % 2 === 0;
});
console.log(allEven);
আউটপুট:
true
সারাংশ
Underscore.js এর Collection Functions অ্যারে এবং অবজেক্টের উপর বিভিন্ন ধরণের কার্যকলাপ করার জন্য অত্যন্ত কার্যকরী এবং সিম্পল ফাংশন প্রদান করে। এই ফাংশনগুলির মধ্যে each, map, filter, reduce, find, every ইত্যাদি রয়েছে, যা ডেটা ম্যানিপুলেশন এবং কোডকে আরও সুশৃঙ্খল এবং কার্যকরী করতে সাহায্য করে। Underscore.js এর Collection Functions ওয়েব ডেভেলপারদের জন্য কার্যকরী টুল হিসেবে কাজ করে, যা তাদের কাজের গতি এবং কোডের মান বাড়ায়।
_.each এবং _.forEach এর মধ্যে পার্থক্য
Underscore.js এবং JavaScript এর মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য হল, Underscore.js এর _.each এবং JavaScript এর forEach একই ধরনের ফাংশনালিটি প্রদান করে, তবে তাদের কিছু পার্থক্য রয়েছে। উভয় ফাংশনই একটি অ্যারে বা অবজেক্টের প্রতিটি উপাদান বা কী-ভ্যালু পেয়ার জন্য একটি ফাংশন চালানোর জন্য ব্যবহৃত হয়, কিন্তু তাদের ব্যবহার এবং কর্মপদ্ধতি কিছুটা আলাদা।
_.each (Underscore.js)
_.eachহল Underscore.js লাইব্রেরির একটি ফাংশন, যা অ্যারে বা অবজেক্টের প্রতিটি উপাদানে একটি নির্দিষ্ট ফাংশন প্রয়োগ করতে ব্যবহৃত হয়।- এটি অ্যারে এবং অবজেক্ট উভয়ের উপরে কাজ করে।
forEach (JavaScript)
forEachহল JavaScript এর বিল্ট-ইন ফাংশন, যা শুধুমাত্র অ্যারে উপর কাজ করে। এটি অ্যারের প্রতিটি উপাদানকে একটি কলব্যাক ফাংশনের মাধ্যমে চালায়।
_.each এর ব্যবহার (Underscore.js)
_.each একটি হায়ার-অর্ডার ফাংশন যা একটি অ্যারে বা অবজেক্টের প্রতিটি উপাদানে একটি ফাংশন প্রয়োগ করে। এটি একটি অ্যারে বা অবজেক্টে লুপিং (looping) করতে ব্যবহৃত হয়।
সিনট্যাক্স:
_.each(collection, iteratee, [context]);
collection: অ্যারে বা অবজেক্ট।iteratee: প্রতিটি উপাদান বা কী-ভ্যালু পেয়ার নিয়ে যে ফাংশনটি কাজ করবে।[context]: (অপশনাল) ফাংশনেরthisকনটেক্সট নির্ধারণ।
উদাহরণ ১ - অ্যারে দিয়ে _.each:
var numbers = [1, 2, 3, 4];
_.each(numbers, function(num) {
console.log(num * 2);
});
// Output: 2, 4, 6, 8
উদাহরণ ২ - অবজেক্ট দিয়ে _.each:
var person = { name: "John", age: 25, city: "New York" };
_.each(person, function(value, key) {
console.log(key + ": " + value);
});
// Output:
// name: John
// age: 25
// city: New York
forEach এর ব্যবহার (JavaScript)
forEach হল একটি বিল্ট-ইন JavaScript ফাংশন যা একটি অ্যারে বা তালিকার উপর কাজ করে। এটি একটি ফাংশনকে প্রতিটি উপাদানের জন্য কল করে এবং কোনো নতুন অ্যারে তৈরি করে না, বরং পুরানো অ্যারের উপরই কাজ করে।
সিনট্যাক্স:
array.forEach(callback(currentValue, index, array), thisArg);
callback: একটি ফাংশন যা প্রতিটি উপাদানের জন্য চালানো হবে।currentValue: বর্তমান উপাদান।index: (অপশনাল) উপাদানের ইনডেক্স।array: (অপশনাল) মূল অ্যারে।
thisArg: (অপশনাল)callbackফাংশনেthisকনটেক্সট।
উদাহরণ ১ - অ্যারে দিয়ে forEach:
let numbers = [1, 2, 3, 4];
numbers.forEach(function(num) {
console.log(num * 2);
});
// Output: 2, 4, 6, 8
উদাহরণ ২ - অবজেক্টের ইনডেক্স সহ forEach:
let person = ["John", "Jane", "Doe"];
person.forEach(function(value, index) {
console.log("Index " + index + ": " + value);
});
// Output:
// Index 0: John
// Index 1: Jane
// Index 2: Doe
পার্থক্য (Difference between _.each and forEach)
| বৈশিষ্ট্য | _.each (Underscore.js) | forEach (JavaScript) |
|---|---|---|
| কাজ করার সুযোগ | অ্যারে এবং অবজেক্ট উভয়ের উপর কাজ করে | শুধুমাত্র অ্যারে এর উপর কাজ করে |
| ফাংশন ব্যবহারের ধরণ | প্রথম আর্গুমেন্ট হিসেবে অ্যারে বা অবজেক্ট গ্রহণ করে এবং দ্বিতীয় আর্গুমেন্ট হিসেবে ফাংশন নেয় | প্রথম আর্গুমেন্ট হিসেবে ফাংশন গ্রহণ করে |
| ফাংশন পরামিতি | value, key/index (অবজেক্টের জন্য কীগুলি) | currentValue, index, array |
| পুনরায় ফিরে আসা | কোন মান রিটার্ন করে না (undefined) | কোন মান রিটার্ন করে না (undefined) |
সারাংশ
_.eachএকটি Underscore.js ফাংশন যা অ্যারে এবং অবজেক্ট উভয়ের উপর কাজ করে এবং আপনাকে একটি নির্দিষ্ট ফাংশন প্রয়োগ করতে সহায়তা করে।forEachJavaScript এর বিল্ট-ইন ফাংশন যা শুধুমাত্র অ্যারে এর উপরে কাজ করে এবং এটি প্রতিটি উপাদানে ফাংশন প্রয়োগ করে।
আপনি যদি Underscore.js ব্যবহার করেন, তবে _.each ব্যবহার করা ভালো, কারণ এটি অ্যারে এবং অবজেক্ট উভয় ক্ষেত্রেই কার্যকরী। তবে যদি আপনি শুধু অ্যারে নিয়েই কাজ করছেন এবং JavaScript এর বিল্ট-ইন ফাংশন ব্যবহার করতে চান, তবে forEach উপযুক্ত।
_.map এবং _.collect এর ভূমিকা
Underscore.js-এ _.map এবং _.collect ফাংশন দুটি অত্যন্ত গুরুত্বপূর্ণ এবং জনপ্রিয় ফাংশন, যেগুলি ডেটা ম্যানিপুলেশন বা পরিবর্তন করার জন্য ব্যবহৃত হয়। এই ফাংশনগুলোর মাধ্যমে আপনি একটি অ্যারে বা অবজেক্টের প্রতিটি উপাদানকে একটি নির্দিষ্ট ফাংশন প্রয়োগ করে পরিবর্তন করতে পারেন। যদিও _.map এবং _.collect একে অপরের সমতুল্য (এবং _.collect মূলত _.map এর সমার্থক), তবে এগুলোর ব্যবহারের মাধ্যমে ডেটা পরিবর্তন এবং প্রক্রিয়াকরণের কাজটি সহজ হয়।
_.map ফাংশন
_.map হল একটি লুপিং ফাংশন যা একটি অ্যারে বা অবজেক্টের প্রতিটি উপাদানে একটি ফাংশন প্রয়োগ করে এবং সেই পরিবর্তিত মানগুলির একটি নতুন অ্যারে ফেরত দেয়। এটি JavaScript এর map() ফাংশনের মতো কাজ করে।
বৈশিষ্ট্য:
- এটি একটি অ্যারে বা অবজেক্টের প্রতিটি উপাদান বা প্রপার্টিতে নির্দিষ্ট একটি ফাংশন প্রয়োগ করে।
- এটি একটি নতুন অ্যারে তৈরি করে যা পরিবর্তিত উপাদানগুলো ধারণ করে।
উদাহরণ:
// অ্যারে ডেটার উপর map প্রয়োগ করা
let numbers = [1, 2, 3, 4, 5];
let squaredNumbers = _.map(numbers, function(num) {
return num * num;
});
console.log(squaredNumbers); // [1, 4, 9, 16, 25]
এখানে, _.map ফাংশনটি numbers অ্যারের প্রতিটি উপাদানে একটি ফাংশন প্রয়োগ করেছে, যা প্রতিটি সংখ্যাকে বর্গমূল (square) করছে এবং নতুন অ্যারে তৈরি করছে।
অবজেক্টের সাথে ব্যবহার:
let users = [
{ name: "John", age: 28 },
{ name: "Jane", age: 32 },
{ name: "Doe", age: 22 }
];
let userNames = _.map(users, function(user) {
return user.name;
});
console.log(userNames); // ["John", "Jane", "Doe"]
এখানে, _.map ফাংশনটি users অবজেক্টের প্রতিটি উপাদানের মধ্যে name প্রপার্টি বের করে একটি নতুন অ্যারে তৈরি করছে।
_.collect ফাংশন
Underscore.js-এ _.collect মূলত _.map এর সমতুল্য ফাংশন। তবে, এর ব্যবহারেও একই ধারণা আছে—অর্থাৎ, এটি একটি অ্যারে বা অবজেক্টের উপর একটি ফাংশন প্রয়োগ করে এবং পরিবর্তিত ডেটার একটি নতুন অ্যারে ফিরিয়ে দেয়।
_.collect এর উদাহরণ:
let numbers = [1, 2, 3, 4, 5];
let doubledNumbers = _.collect(numbers, function(num) {
return num * 2;
});
console.log(doubledNumbers); // [2, 4, 6, 8, 10]
এখানে _.collect ফাংশনটি numbers অ্যারের প্রতিটি উপাদানে একটি ফাংশন প্রয়োগ করেছে, যা প্রতিটি সংখ্যাকে দ্বিগুণ (double) করছে এবং একটি নতুন অ্যারে তৈরি করছে।
_.collect এবং _.map প্রায় একই কাজ করে, তবে _.map অনেক বেশি ব্যবহৃত হয় এবং আধুনিক সংস্করণে _.collect ফাংশনটি পুরনো সংস্করণে রয়েছে।
_.map এবং _.collect দিয়ে ডেটা ম্যানিপুলেশন
এই দুটি ফাংশন ব্যবহার করে আপনি আপনার ডেটাকে সহজেই ম্যানিপুলেট (manipulate) করতে পারেন। এখানে কিছু বাস্তবজীবন উদাহরণ দেওয়া হলো:
1. অবজেক্টের প্রপার্টি পরিবর্তন করা
let products = [
{ name: "Laptop", price: 1200 },
{ name: "Phone", price: 800 },
{ name: "Tablet", price: 400 }
];
let discountedPrices = _.map(products, function(product) {
return {
name: product.name,
discountedPrice: product.price * 0.9
};
});
console.log(discountedPrices);
// [
// { name: "Laptop", discountedPrice: 1080 },
// { name: "Phone", discountedPrice: 720 },
// { name: "Tablet", discountedPrice: 360 }
// ]
এখানে, _.map ফাংশনটি products অ্যারের প্রতিটি অবজেক্টের price প্রপার্টি থেকে ডিসকাউন্টেড প্রাইজ বের করে একটি নতুন অবজেক্ট তৈরি করছে।
2. অ্যারে ডেটা ফিল্টার করা এবং পরিবর্তন করা
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
let evenNumbersSquared = _.map(_.filter(numbers, function(num) {
return num % 2 === 0; // even numbers
}), function(num) {
return num * num; // square each even number
});
console.log(evenNumbersSquared); // [4, 16, 36, 64, 100]
এখানে, প্রথমে _.filter দিয়ে ইভেন নম্বরগুলো ফিল্টার করা হয়েছে এবং পরে _.map ব্যবহার করে ঐ ইভেন নম্বরগুলোকে বর্গমূল (square) করা হয়েছে।
সারসংক্ষেপ
_.map এবং _.collect হল Underscore.js এর গুরুত্বপূর্ণ ফাংশন যা ডেটার প্রতিটি উপাদানে একটি নির্দিষ্ট ফাংশন প্রয়োগ করে একটি নতুন অ্যারে তৈরি করে। _.map হল আধুনিক কোডিং এর জন্য সেরা পছন্দ, এবং _.collect পুরনো সংস্করণে ব্যবহৃত হয় তবে একই কাজ করে। এই ফাংশনগুলোর মাধ্যমে ডেটা ম্যানিপুলেশন অনেক সহজ হয়ে যায় এবং জাভাস্ক্রিপ্ট কোডিং আরো সংক্ষিপ্ত এবং কার্যকরী হয়।
_.reduce এবং _.foldl এর মধ্যে পার্থক্য
Underscore.js লাইব্রেরিতে _.reduce এবং _.foldl দুটি ফাংশনই অ্যারে বা তালিকার উপাদানগুলিকে একত্রিত করতে ব্যবহৃত হয়, তবে তাদের মধ্যে কিছু পার্থক্য রয়েছে। দুটি ফাংশনই মূলত একটি "অ্যাকিউমুলেটর" বা সঞ্চয়কারী (যেমন সংখ্যা, অবজেক্ট বা অ্যারে) তৈরি করে এবং অ্যারে বা তালিকার প্রতিটি উপাদানকে তার মধ্যে একত্রিত করে।
_.reduce:
_.reduce হল একটি জেনেরিক ফাংশন যা অ্যারে বা তালিকার উপাদানগুলোকে একত্রিত করে, একটি একক মানে রূপান্তরিত করে। এটি ডিফল্টভাবে ডান দিক থেকে বাম দিকে কাজ করে (যদি কোনো স্টার্টিং ভ্যালু না দেওয়া হয়)।
_.foldl:
_.foldl হলো _.reduce এর একটি প্রাচীন সংস্করণ যা মূলত বামে থেকে ডানে কাজ করে (এটা লজিক্যালভাবে কোডিং লাইফ সাইকেলের একদম প্রথম সংস্করণ ছিল)।
উল্লেখযোগ্যভাবে, _.foldl বর্তমানে _.reduce দ্বারা প্রতিস্থাপিত হয়েছে, এবং _.foldl ব্যবহার করার পরিবর্তে আপনি সাধারণত _.reduce ব্যবহার করবেন।
_.reduce এবং _.foldl উদাহরণ দিয়ে ডেটা একত্রিত করা
১. _.reduce দিয়ে ডেটা একত্রিত করা
_.reduce একটি অ্যারে বা তালিকার সকল উপাদানকে একত্রিত করার জন্য ব্যবহৃত হয়। এটি দুটি আর্গুমেন্ট নেয়: প্রথমটি অ্যাকিউমুলেটর এবং দ্বিতীয়টি বর্তমান মান। নিচে একটি উদাহরণ দেওয়া হল:
// Underscore.js - _.reduce উদাহরণ
const numbers = [1, 2, 3, 4, 5];
// অ্যাকিউমুলেটর ব্যবহার করে সংখ্যা যোগ করা
const sum = _.reduce(numbers, function(memo, num) {
return memo + num;
}, 0);
console.log(sum); // আউটপুট: 15
এখানে, memo হলো অ্যাকিউমুলেটর এবং num হলো বর্তমান উপাদান। শুরুতে 0 ভ্যালু দেয়া হয়েছে, এবং প্রতিটি সংখ্যার সাথে যোগ করে মোট যোগফল বের করা হয়েছে।
২. _.foldl দিয়ে ডেটা একত্রিত করা
_.foldl ব্যবহারের ক্ষেত্রে, এটি অ্যারে বা তালিকার প্রথম উপাদান থেকে শুরু করে একত্রিত করে। যদিও এটি এখন পুরনো, তবুও কিছু কোডবেসে এটি দেখা যেতে পারে।
// Underscore.js - _.foldl উদাহরণ
const numbers = [1, 2, 3, 4, 5];
// অ্যাকিউমুলেটর ব্যবহার করে সংখ্যা যোগ করা
const sum = _.foldl(numbers, function(memo, num) {
return memo + num;
}, 0);
console.log(sum); // আউটপুট: 15
এখানে, _.foldl এবং _.reduce একইভাবে কাজ করে, কিন্তু তাদের কার্যপদ্ধতি সাদৃশ্য থাকতে পারে, তবে _.reduce আধুনিক কোডবেসে বেশি ব্যবহৃত হয়।
৩. অন্য একটি উদাহরণ: অ্যারে একত্রিত করা (সাধারণভাবে)
ধরা যাক, আপনি কিছু স্ট্রিং মান নিয়ে একটি অ্যারে তৈরি করেছেন এবং সেগুলোকে একত্রিত করতে চান:
const words = ['hello', 'world', 'from', 'underscore'];
// শব্দগুলো একত্রিত করা
const sentence = _.reduce(words, function(memo, word) {
return memo + ' ' + word;
}, '');
console.log(sentence); // আউটপুট: "hello world from underscore"
এখানে, অ্যাকিউমুলেটর হল একটি স্ট্রিং (শুরুতে খালি), এবং প্রতিটি শব্দের সাথে যোগ করা হচ্ছে।
৪. অ্যাকিউমুলেটর হিসেবে অবজেক্ট ব্যবহার করা
const users = [
{ 'name': 'John', 'age': 28 },
{ 'name': 'Jane', 'age': 22 },
{ 'name': 'Mike', 'age': 32 }
];
// অ্যাকিউমুলেটর হিসেবে অবজেক্ট ব্যবহার করে
const ageSum = _.reduce(users, function(memo, user) {
return memo + user.age;
}, 0);
console.log(ageSum); // আউটপুট: 82
এখানে, আমরা অ্যাকিউমুলেটর হিসেবে একটি সংখ্যা (এজ যোগ করা) ব্যবহার করেছি। _.reduce প্রতিটি ব্যবহারকারীর বয়স একত্রিত করছে এবং মোট বয়সের যোগফল প্রদান করছে।
_.reduce এবং _.foldl এর মধ্যে পার্থক্য সন্নিবেশিত
_.reduceহলো আধুনিক এবং অনেক বেশি ব্যবহৃত ফাংশন যা ডেটার উপর অপারেশন চালানোর জন্য, এবং বামে থেকে ডানে অপারেট করে।_.foldlএকইভাবে কাজ করত, তবে এটি একটি পুরনো সংস্করণ, যেটি সাধারণত এখন আর ব্যবহার হয় না এবং_.reduceদ্বারা প্রতিস্থাপিত হয়েছে।
_.reduce এবং _.foldl সাধারণভাবে একই কাজ করে এবং তাদের মধ্যে পার্থক্য খুবই সামান্য, তবে উন্নত এবং আধুনিক কোডবেসে _.reduce ব্যবহৃত হয়।
_.filter এবং _.select ফাংশন
Underscore.js একটি জনপ্রিয় লাইব্রেরি যা বিভিন্ন ইউটিলিটি ফাংশন সরবরাহ করে, যা ডেটা ম্যানিপুলেশন সহজ করে তোলে। এর মধ্যে দুটি গুরুত্বপূর্ণ ফাংশন হলো _.filter এবং _.select। যদিও _.select মূলত _.map এর একটি সিনোনিম (যেমন _.map ফাংশনের মত কাজ করে), তবে এখানে আমরা কেবল _.filter সম্পর্কে বিস্তারিত আলোচনা করব, যেহেতু এটি ডেটা ফিল্টার করার জন্য ব্যবহৃত হয়।
_.filter ফাংশন
_.filter হল একটি ইউটিলিটি ফাংশন যা একটি অ্যারে বা অ্যানবজেক্টের মধ্যে থেকে নির্দিষ্ট শর্ত অনুযায়ী আইটেমগুলো নির্বাচন (filter) করে একটি নতুন অ্যারে রিটার্ন করে। এই ফাংশনটি সাধারণত ব্যবহার করা হয়, যখন আপনি কিছু ডেটা নির্দিষ্ট শর্তের ভিত্তিতে ফিল্টার করতে চান।
_.filter ফাংশন একটি আর্গুমেন্ট হিসেবে একটি অ্যারে এবং একটি ফাংশন নেয়। ফাংশনটি প্রতিটি আইটেমের জন্য চালানো হয় এবং যদি সেই আইটেম শর্ত পূর্ণ করে, তাহলে এটি ফিল্টার করা হয়।
Sintax:
_.filter(collection, predicate)
collection: অ্যারে বা অবজেক্ট যা আপনি ফিল্টার করতে চান।predicate: একটি ফাংশন যা প্রতিটি আইটেমের জন্য পরীক্ষা করা হয়। যদি এটি সত্য (true) রিটার্ন করে, তবে সেই আইটেমটি নতুন অ্যারেতে অন্তর্ভুক্ত হবে।
উদাহরণ:
// একটি অ্যারে ডেটা
let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
// _.filter দিয়ে ফিল্টার করা (যত সংখ্যাটি ৫ এর চেয়ে বড়)
let result = _.filter(numbers, function(num) {
return num > 5;
});
console.log(result); // [6, 7, 8, 9, 10]
এখানে, _.filter ফাংশনটি numbers অ্যারে থেকে সব সংখ্যা নির্বাচন করেছে যেগুলো ৫ এর চেয়ে বড়।
_.select ফাংশন
_.select মূলত _.map এর সমতুল্য ছিল, এবং এখন _.map ফাংশনটি এটি প্রতিস্থাপন করেছে। এর মাধ্যমে আপনি একটি অ্যারের প্রতিটি আইটেমকে পরিবর্তন (transform) করতে পারেন বা একটি নতুন অ্যারে তৈরি করতে পারেন যা সংশোধিত আইটেম ধারণ করে। যদিও এর কাজ _.filter এর মতো নয়, তবে এটি সাধারণভাবে নতুন অ্যারে তৈরি করে।
Sintax:
_.select(collection, predicate)
collection: অ্যারে বা অবজেক্টpredicate: একটি ফাংশন যা প্রতিটি আইটেমের জন্য পরীক্ষা করা হয়।
এটি _.filter এর মতো কাজ করে, তবে মূলত এটি পুরানো _.map ফাংশনের একটি অংশ ছিল এবং এখন এটি অবলুপ্ত হয়ে গিয়েছে। আজকাল সাধারণত _.map ব্যবহার করা হয়।
উদাহরণ:
// একটি অ্যারে ডেটা
let numbers = [1, 2, 3, 4, 5];
// _.select ব্যবহার করে (যত সংখ্যাটি ৫ এর চেয়ে ছোট)
let result = _.select(numbers, function(num) {
return num < 5;
});
console.log(result); // [1, 2, 3, 4]
এখানে _.select ফাংশনটি numbers অ্যারে থেকে ৫ এর চেয়ে ছোট সংখ্যাগুলি নির্বাচন করেছে। তবে এটি এখন _.map ফাংশনের মধ্যে একীভূত হয়ে গিয়েছে, তাই নতুন প্রোজেক্টে আপনি _.map ব্যবহার করতে পারেন।
সারাংশ
_.filterব্যবহার করা হয় ডেটা ফিল্টার করার জন্য যেখানে একটি নির্দিষ্ট শর্ত বা ক্রাইটেরিয়া অনুযায়ী অ্যারে বা অ্যানবজেক্টের উপাদানগুলি ফিল্টার করা হয়।_.selectএবং_.mapমূলত একই কাজ করে, যেখানে আপনি অ্যারের প্রতিটি আইটেম পরিবর্তন করতে পারেন বা একটি নতুন অ্যারে তৈরি করতে পারেন। তবে আজকাল_.mapফাংশনই বেশি ব্যবহৃত হয় এবং এটি_.selectএর পরিবর্তে এসেছে।
আপনি যখন অ্যারে বা অ্যানবজেক্টের উপাদানগুলো নির্দিষ্ট শর্তে ফিল্টার করতে চান, তখন _.filter ফাংশনটি সবচেয়ে কার্যকর এবং সঠিক উপায়।
_.find এবং _.detect কী?
Underscore.js-এ _.find এবং _.detect দুটি ফাংশন ব্যবহৃত হয় একই কাজের জন্য, যা একটি অ্যারে বা অবজেক্ট থেকে নির্দিষ্ট শর্তে মিল থাকা প্রথম উপাদানটি খুঁজে বের করে। এই দুটি ফাংশনের মধ্যে কোনো পার্থক্য নেই, এবং উভয়ই একইভাবে কাজ করে। _.find হল আধুনিক নাম, এবং _.detect একটি পুরানো নাম ছিল, তবে তারা এখন একে অপরের প্রতিস্থাপন হিসেবে কাজ করে।
এটি হাইয়ার অর্ডার ফাংশন (higher-order function) হিসাবে কাজ করে, যেখানে আপনি একটি শর্ত (predicate) প্রদান করেন এবং এটি প্রথম মিল পাওয়া উপাদানটি রিটার্ন করে।
_.find এবং _.detect এর সিম্পল সিঁট্যাক্স:
_.find(collection, predicate, [context])
এখানে:
- collection: এটি যে ডেটার উপরে কাজ করা হবে (অ্যারে, অবজেক্ট, ইত্যাদি)।
- predicate: একটি ফাংশন বা শর্ত যা প্রতিটি উপাদান চেক করবে।
- context (optional): যদি আপনি শর্তের জন্য একটি নির্দিষ্ট কনটেক্সট দিতে চান, তবে এটি প্রদান করা যেতে পারে।
এটি শর্তের সাথে মিল থাকা প্রথম উপাদানটি রিটার্ন করে। যদি কোনো উপাদান না পাওয়া যায়, তবে এটি undefined রিটার্ন করবে।
উদাহরণ ১: অ্যারেতে নির্দিষ্ট উপাদান খোঁজা
ধরা যাক, আপনার কাছে একটি অ্যারে আছে এবং আপনি সেই অ্যারেতে প্রথম এমন ব্যক্তি খুঁজে বের করতে চান যার বয়স ৩০ বছর।
const people = [
{ name: 'John', age: 25 },
{ name: 'Jane', age: 30 },
{ name: 'Mike', age: 35 }
];
const result = _.find(people, function(person) {
return person.age === 30;
});
console.log(result);
// আউটপুট: { name: 'Jane', age: 30 }
এখানে, _.find ফাংশনটি প্রথম সেই ব্যক্তি নির্বাচন করেছে যার বয়স ৩০, এবং { name: 'Jane', age: 30 } রিটার্ন করেছে।
উদাহরণ ২: অবজেক্টে নির্দিষ্ট উপাদান খোঁজা
আপনি যদি একটি অবজেক্টে নির্দিষ্ট কনডিশন অনুযায়ী একটি উপাদান খুঁজতে চান, তখনও _.find ব্যবহার করতে পারেন।
const users = {
user1: { name: 'Alice', isActive: false },
user2: { name: 'Bob', isActive: true },
user3: { name: 'Charlie', isActive: false }
};
const result = _.find(users, function(user) {
return user.isActive === true;
});
console.log(result);
// আউটপুট: { name: 'Bob', isActive: true }
এখানে, _.find প্রথম সেই ব্যবহারকারী নির্বাচন করেছে যার isActive প্রপার্টি true ছিল, এবং { name: 'Bob', isActive: true } রিটার্ন করেছে।
উদাহরণ ৩: কাস্টম প্রেডিকেট ফাংশন ব্যবহার
আপনি যদি একটি কাস্টম শর্ত দিয়ে উপাদান খুঁজতে চান, তাহলে আপনি সেই শর্তের জন্য একটি ফাংশন প্রদান করতে পারেন।
const products = [
{ name: 'Laptop', price: 1000 },
{ name: 'Phone', price: 500 },
{ name: 'Tablet', price: 750 }
];
const expensiveProduct = _.find(products, function(product) {
return product.price > 700;
});
console.log(expensiveProduct);
// আউটপুট: { name: 'Laptop', price: 1000 }
এখানে, _.find প্রথমে সেই পণ্য নির্বাচন করেছে যার মূল্য ৭০০ এর বেশি, এবং { name: 'Laptop', price: 1000 } রিটার্ন করেছে।
_.find এবং _.detect এর মধ্যে পার্থক্য
যদিও _.find এবং _.detect একই কাজ করে, _.find আধুনিক নাম হিসেবে পরিগণিত এবং এখন ব্যবহার করা হয়। _.detect পূর্ববর্তী সংস্করণের নাম ছিল এবং এটি বর্তমানে _.find দ্বারা প্রতিস্থাপিত হয়েছে। তবে, কিছু পুরানো কোডবেসে এখনও _.detect ব্যবহৃত হতে পারে, তবে তা _.find দিয়েই পরিবর্তন করা উচিত।
সারাংশ
_.find এবং _.detect Underscore.js বা Lodash-এ ব্যবহৃত দুটি গুরুত্বপূর্ণ ফাংশন যা ডেটার মধ্যে শর্তানুসারে প্রথম উপাদান খুঁজে বের করে। এটি অ্যারে বা অবজেক্টের সাথে কাজ করে এবং ডেটার ম্যানিপুলেশনকে সহজ এবং দ্রুত করে তোলে। আপনি যখন একটি শর্তের ভিত্তিতে প্রথম উপাদানটি খুঁজতে চান, তখন এই ফাংশনটি অত্যন্ত কার্যকরী।
Read more