মূল বিষয়ে যান
WebGuideBD AI Academy

Loops, Modules ও Execution Flow

35 মিনিট · আবশ্যক

  • for ও for...of loop লিখে প্রতিটি ধাপে variable-এর মান ট্রেস করতে পারবেন
  • map, filter, reduce দিয়ে array রূপান্তর করতে পারবেন
  • module কেন দরকার এবং import/export কীভাবে কাজ করে ব্যাখ্যা করতে পারবেন

সমস্যাটা কী?

মাস শেষে মালিক জানতে চান: (১) মোট স্টকের মূল্য কত টাকা, (২) কোন পণ্যগুলো স্টকে আছে, (৩) সব দাম ৫% বাড়ালে নতুন তালিকা কী। ৫০০ পণ্যের জন্য প্রতিটি আলাদা লাইনে লেখা অসম্ভব।

শেখার লক্ষ্য

  • for ও for...of loop লিখে প্রতিটি ধাপে variable-এর মান ট্রেস করতে পারবেন
  • map, filter, reduce দিয়ে array রূপান্তর করতে পারবেন
  • module কেন দরকার এবং import/export কীভাবে কাজ করে ব্যাখ্যা করতে পারবেন

আনুমানিক সময়: 35 মিনিট

পূর্বশর্ত

ব্যাখ্যা

লুপ (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—এই রানার ৩ সেকেন্ড পর থামিয়ে দেবে।

তিনটি প্রধান array method
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));
এই সাইটের রানার নিরাপত্তার কারণে বাইরের ফাইল বা নেটওয়ার্ক থেকে import করতে দেয় না। তাই অনুশীলনে একটি ছোট ভার্চুয়াল মডিউল ব্যবস্থা আছে: 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);
reduce-এর execution flow
ধাপsum (আগে)pp.price × p.stocksum (পরে)
১0শার্ট450 × 12 = 54005400
২5400ব্যাগ1200 × 0 = 05400
৩5400মগ90 × 40 = 36009000

শেষ ফল ৯০০০। 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;
}

JavaScript চালু থাকলে এখানে Run বাটনসহ এডিটর আসবে।

লাইন ধরে বুঝি
  • 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

সূত্র ও যাচাই

যাচাইয়ের তারিখ: 2026-10-19; লেখক: Muhibbullah Ansary। এই পাঠের 1টি JavaScript উদাহরণ বিল্ডের সময় সাইটের একই QuickJS রানারে চালানো হয়েছে এবং প্রত্যাশিত আউটপুট মিলেছে; সংখ্যাগত ফলাফল আলাদা assertion দিয়ে (floating-point tolerance সহ) পরীক্ষিত। এই পাঠের ডেটা/উদাহরণ শেখানোর জন্য তৈরি সিন্থেটিক ডেটা—বাস্তব কোনো দোকান বা গ্রাহকের নয়। স্বাধীন বিশেষজ্ঞ রিভিউ এখনও হয়নি; ভুল পেলে যোগাযোগ পাতায় জানান।

জ্ঞান যাচাই

<code>[1, 2, 3].map((x) => x * 10)</code> এর ফল কী?
<code>[5, 0, 8].filter((x) => x > 0)</code> এর ফল কী?
<code>for (let i = 0; i < 3; i--)</code> loop-এর সমস্যা কী?

আপনার শেখার অগ্রগতি সংরক্ষণ করতে লগইন করুন।

এখানে প্রশ্ন করুন

আপনার শেখার অগ্রগতি সংরক্ষণ করতে লগইন করুন।