Loops, Modules ও Execution Flow
- for ও for...of loop লিখে প্রতিটি ধাপে variable-এর মান ট্রেস করতে পারবেন
- map, filter, reduce দিয়ে array রূপান্তর করতে পারবেন
- module কেন দরকার এবং import/export কীভাবে কাজ করে ব্যাখ্যা করতে পারবেন
সমস্যাটা কী?
মাস শেষে মালিক জানতে চান: (১) মোট স্টকের মূল্য কত টাকা, (২) কোন পণ্যগুলো স্টকে আছে, (৩) সব দাম ৫% বাড়ালে নতুন তালিকা কী। ৫০০ পণ্যের জন্য প্রতিটি আলাদা লাইনে লেখা অসম্ভব।
শেখার লক্ষ্য
- for ও for...of loop লিখে প্রতিটি ধাপে variable-এর মান ট্রেস করতে পারবেন
- map, filter, reduce দিয়ে array রূপান্তর করতে পারবেন
- module কেন দরকার এবং import/export কীভাবে কাজ করে ব্যাখ্যা করতে পারবেন
পূর্বশর্ত
ব্যাখ্যা
লুপ (loop): একই কোড বারবার চালায়।
const stock = [12, 0, 40];
for (let i = 0; i < stock.length; i++) { // শুরু; শর্ত; প্রতি ধাপের পর
console.log("index", i, "স্টক", stock[i]);
}
for (const s of stock) { // index না লাগলে সহজ রূপ
console.log(s);
}for (let i = 0; i < n; i++): i = ০ দিয়ে শুরু, প্রতিবার শর্ত দেখে, সত্য হলে ভেতরের কোড চালায়, তারপর i এক বাড়ায় (i++)। শর্ত মিথ্যা হলে থামে। শর্ত কখনো মিথ্যা না হলে অসীম loop—এই রানার ৩ সেকেন্ড পর থামিয়ে দেবে।
| Method | কী করে | ফেরত দেয় |
|---|---|---|
arr.map(f) | প্রতিটি উপাদানে f চালায় | একই দৈর্ঘ্যের নতুন array |
arr.filter(f) | f যেগুলোতে true দেয় সেগুলো রাখে | ছোট বা সমান দৈর্ঘ্যের নতুন array |
arr.reduce(f, শুরু) | সব উপাদান মিলিয়ে একটি মান বানায় | একটি মান (যেমন যোগফল) |
মডিউল (module): কোডকে আলাদা ফাইলে ভাগ করার ব্যবস্থা। একটি ফাইল export করে, অন্যটি import করে।
// pricing.js
export function withVat(price) { return price * 1.15; }
// main.js
import { withVat } from "./pricing.js";
console.log(withVat(100));defineModule("নাম", (exports) => { ... }) দিয়ে মডিউল বানান, requireModule("নাম") দিয়ে আনুন। ধারণা একই—নিজের কম্পিউটারে Node.js বা ব্রাউজারে আসল import/export ব্যবহার করবেন।উপমা — এবং কোথায় ভাঙে
উপমা: Loop হলো ক্যাশিয়ার যিনি লাইনের প্রত্যেক গ্রাহকের কাছে একই প্রশ্ন করেন; module হলো দোকানের আলাদা বিভাগ (হিসাব, স্টক), প্রত্যেকে নিজের কাজ করে আর নির্দিষ্ট জিনিস অন্যদের দেয়।
কোথায় ভাঙে: ক্যাশিয়ার লাইন শেষ হলে নিজে থামেন; loop থামে শুধু যদি আপনি সঠিক শর্ত লেখেন। আর বাস্তব বিভাগ নিজে থেকে যোগাযোগ করে; module শুধু export করা জিনিসই দেয়।
ধাপে ধাপে উদাহরণ
মোট স্টক-মূল্য (দাম × স্টক) reduce দিয়ে, প্রতিটি ধাপ ট্রেস:
const products = [
{ name: "শার্ট", price: 450, stock: 12 },
{ name: "ব্যাগ", price: 1200, stock: 0 },
{ name: "মগ", price: 90, stock: 40 },
];
const value = products.reduce((sum, p) => sum + p.price * p.stock, 0);| ধাপ | sum (আগে) | p | p.price × p.stock | sum (পরে) |
|---|---|---|---|---|
| ১ | 0 | শার্ট | 450 × 12 = 5400 | 5400 |
| ২ | 5400 | ব্যাগ | 1200 × 0 = 0 | 5400 |
| ৩ | 5400 | মগ | 90 × 40 = 3600 | 9000 |
শেষ ফল ৯০০০। 0 হলো শুরুর মান—এটি না দিলে খালি array-তে reduce এরর দেয়।
অনুশীলন / অ্যাক্টিভিটি
console.log আউটপুট দেখায়। ব্রাউজারের DOM, নেটওয়ার্ক (fetch), টাইমার বা ফাইল এখানে নেই—ইচ্ছাকৃতভাবে। Ctrl/⌘ + Enter চাপলেও Run হয়।map / filter / reduce এবং ভার্চুয়াল মডিউল
defineModule("pricing", (exports) => {
exports.increase = (price, percent) => Math.round(price * (1 + percent / 100));
});
const { increase } = requireModule("pricing");
const products = [
{ name: "শার্ট", price: 450, stock: 12 },
{ name: "ব্যাগ", price: 1200, stock: 0 },
{ name: "মগ", price: 90, stock: 40 },
];
// ১) স্টকে আছে এমন পণ্যের নাম
const available = products.filter((p) => p.stock > 0).map((p) => p.name);
console.log("স্টকে:", available);
// ২) মোট স্টক-মূল্য
const value = products.reduce((sum, p) => sum + p.price * p.stock, 0);
console.log("মোট মূল্য:", value);
// ৩) ৫% দাম বাড়ানো তালিকা (আসল array বদলাবে না)
const raised = products.map((p) => ({ name: p.name, price: increase(p.price, 5) }));
console.log("নতুন দাম:", raised);
// ৪) এই loop কি থামবে? (শর্তটা দেখুন, তারপর চালান)
let n = 0;
while (n < 3) {
console.log("n =", n);
n = n + 1;
}লাইন ধরে বুঝি
defineModule("pricing", (exports) => {...}): একটি মডিউল নিবন্ধন; ভেতরেexports-এ যা রাখা হয় সেটাই বাইরে পাওয়া যায়।const { increase } = requireModule("pricing"): destructuring—ফেরত আসা object থেকে increase নামের ঘর বের করে একই নামের variable বানায়।filter(...).map(...): chaining—প্রথমে বাছাই, তারপর নাম বের করা। প্রতিটি নতুন array দেয়, আসলটি বদলায় না।Math.round(450 * 1.05)= Math.round(472.5) = 473।while (n < 3): শর্ত সত্য থাকা পর্যন্ত চলে;n = n + 1না থাকলে শর্ত কখনো মিথ্যা হবে না।
এখানে এটা কেন ব্যবহার করেছি?
map/filter/reduce মডেল কোডে সর্বত্র: ভেক্টরের প্রতিটি উপাদান গুণ (map), কম স্কোরের ডকুমেন্ট বাদ (filter), loss যোগ (reduce)। আসল array না বদলে নতুন array বানানো ডেটা নষ্ট হওয়া আটকায়।
কোন বিষয়গুলো মনে রাখব?
- for: index লাগলে; for...of: শুধু মান লাগলে
- map = রূপান্তর, filter = বাছাই, reduce = একটি মানে সংকোচন
- loop-এর থামার শর্ত সবসময় যাচাই করুন
- module: export করা জিনিসই বাইরে যায়
এখনই কোনগুলো মুখস্থ করতে হবে না?
- forEach, some, every, find—দরকার হলে পরে
- CommonJS (require) বনাম ES module-এর পার্থক্য
- do...while
নিজে পরিবর্তন করে দেখুন
reduce দিয়ে স্টকে থাকা পণ্যের সংখ্যা গুনুন (মূল্য নয়)। তারপর filter + length দিয়ে একই কাজ করুন। কোনটি পড়তে সহজ লাগল?
সাধারণ ভুল
- map-এর ভেতরে object ফেরত দিতে বন্ধনী ভুলে যাওয়া: (p) => { name: p.name } কাজ করে না
- reduce-এ শুরুর মান না দেওয়া
- loop-এর ভেতরে loop-এর শর্তের variable না বাড়ানো (অসীম loop)
- i <= arr.length লেখা—শেষ ধাপে undefined
জ্ঞান যাচাই
নিচের 3টি প্রশ্নের উত্তর দিয়ে “জমা দিন” চাপুন। স্কোর সার্ভারে যাচাই হয়; প্রতিটি উত্তরের পর কেন সঠিক বা ভুল তা দেখাবে। লগইন থাকলে ফল আপনার অগ্রগতিতে সংরক্ষিত হয়।
সংক্ষেপে মনে রাখুন
- loop = বারবার একই কাজ
- map/filter/reduce = array-এর তিন হাতিয়ার
- execution flow ট্রেস করে বাগ ধরুন
- module দিয়ে কোড ভাগ
পরবর্তী পাঠ
ডেটা আদান-প্রদানের ভাষা JSON, আর অপেক্ষা করতে হয় এমন কাজের জন্য async/await: JSON, Async/Await ও Errors
সূত্র ও যাচাই
জ্ঞান যাচাই
আপনার শেখার অগ্রগতি সংরক্ষণ করতে লগইন করুন।
এখানে প্রশ্ন করুন
আপনার শেখার অগ্রগতি সংরক্ষণ করতে লগইন করুন।