JavaScript-এ `filter()` এবং `map()` চেইন করে লুপ ছাড়া নির্দিষ্ট শর্ত পূরণ করা অবজেক্টের প্রপার্টি আপডেট করা যায়। এটি ফাংশনাল প্রোগ্রামিং স্টাইল।
ডেটা
const students = [
{ Name: "John" },
{ Name: "David" },
{ Name: "Bob" },
{ Name: "Mike" }
];
ফিল্টার + ম্যাপ পদ্ধতি
const targetName = "Bob";
const newName = "Carol";
// ফিল্টার করে ম্যাপে আপডেট
students
.filter(obj => obj.Name === targetName)
.map(obj => obj.Name = newName);
console.log(students);
চলানোর পদ্ধতি
- কোডটি
updateNoLoop.jsনামে সংরক্ষণ করুন। - টার্মিনালে চালান:
node updateNoLoop.js
আউটপুট
[
{ Name: 'John' },
{ Name: 'David' },
{ Name: 'Carol' },
{ Name: 'Mike' }
]
কীভাবে কাজ করে
- `filter()` - শর্তমত অবজেক্টগুলো সিলেক্ট করে (রেফারেন্স রিটার্ন করে)।
- `map()` - সিলেক্টেড অবজেক্টগুলোতে মিউটেশন করে (`obj.Name = newName`)。
- মূল অ্যারে `students` মিউটেট হয় (রেফারেন্স একই)۔
নন-মিউটেটিং ভার্সন (ইমিউটেবল)
const updated = students.map(obj =>
obj.Name === targetName ? { ...obj, Name: newName } : obj
);
// মূল students অপরিবর্তিত, নতুন অ্যারে updated
findIndex + সরাসরি আপডেট (সিনপ্লিস্ট)
const idx = students.findIndex(obj => obj.Name === targetName);
if (idx !== -1) students[idx].Name = newName;
তুলনা
| পদ্ধতি | মিউটেশন | রিডেবিলিটি | পারফরম্যান্স |
|---|---|---|---|
| filter+map | হ্যাঁ (মূল বদলায়) | মিডিয়াম | O(n) + O(m) |
| map (immutable) | না | উচ্চ | O(n) |
| findIndex + direct | হ্যাঁ | উচ্চ | O(n) সেরা |
| for loop | হ্যাঁ | উচ্চ | O(n) সেরা |
সতর্কতা
- `filter().map()` প্যাটার্নে `map`-এ `return` না করলেও কাজ করে (মিউটেশন হয়) কিন্তু অ্যান্টি-প্যাটার্ন।
- ইমিউটেবল প্যাটার্ন (নতুন অবজেক্ট রিটার্ন) রিঅ্যাক্ট/রেডাক্স-এ বাধ্যতামূলক।