সংক্ষিপ্ত বিবরণ: এই নিবন্ধে আমরা JavaScript এর Array সম্পর্কে বিস্তারিত আলোচনা করব — কী, কেন, কিভাবে, কোন কোন প্রকার আছে, ডিপ কপি বনাম শ্যালো কপি, সাধারণ মেথড, পারফরম্যান্স টিপস এবং বাস্তব জীবনের উদাহরণ। প্রতিটি অংশে উদাহরণ থাকবে <pre> ও <code> ব্লকে।
উপমুখ — আর্টিকেলের আউটলাইন
- Array কী — সংজ্ঞা ও মৌলিক ধারণা
- Array কিভাবে তৈরি করা হয় — লিটারেল ও কনস্ট্রাক্টর
- Array-এর প্রধান প্রকার (Types / Variants)
- Array-র সাধারণ মেথড ও ব্যবহার
- Mutable vs Immutable আচরণ — কপি করার কৌশল
- Multi-dimensional arrays / Nested arrays
- Typed Arrays (ইন্টেনসিভ পারফরম্যান্স প্রয়োজন হলে)
- Common performance pitfalls এবং অপ্টিমাইজেশন
- Array প্রাক্টিসিং: Map, Reduce, Filter — উদাহরণ
- Real-world use-cases: UI, Data processing, APIs
- Error handling এবং validation
- Best practices
- কোড স্নিপেটস ও Cheatsheet
- সারাংশ ও উপসংহার
- FAQ
1. Array কী — সংজ্ঞা ও মৌলিক ধারণা
JavaScript-এ Array হলো ordered collection — অর্থাৎ একাধিক মান (values) একটানা রেখে দ্রুত অ্যাক্সেস ও ম্যানিপুলেশন করার সুবিধা দেয়। Array-র প্রতিটি আইটেমের একটি ইনডেক্স (index) থাকে — 0 থেকে শুরু করে। Array-এ আপনি ভিন্ন ধরনের ডেটা রাখতে পারবেন: সংখ্য, স্ট্রিং, অবজেক্ট, এমনকি ফাংশনও।
কেন Array দরকার? কমপক্ষে তিনটি কারণে:
- একসাথে অনেক ডেটা স্টোর করতে
- সিরিয়াল অপারেশন (loop/map/filter) সহজ করতে
- ডাটা স্ট্রাকচার হিসেবে লজিক গঠন করতে (stack, queue, matrix ইত্যাদি)
উদাহরণ (সিম্পল):
// JavaScript array literal
const fruits = ['apple', 'banana', 'mango'];
console.log(fruits[0]); // 'apple'
2. Array কিভাবে তৈরি করা হয় — লিটারেল ও কনস্ট্রাক্টর
Array তৈরির প্রধান দুটি উপায় আছে: লিটারেল (literal) এবং কনস্ট্রাক্টর (Array constructor)। সাধারণত লিটারেল সবচেয়ে জনপ্রিয় কারণ এটি সংক্ষিপ্ত ও দ্রুত।
লিটারেল (recommended):
const nums = [1, 2, 3, 4];
কনস্ট্রাক্টর (কখন ব্যবহার করবেন):
নিয়মিত ক্ষেত্রে কমন নয়, কিন্তু dynamic length নির্ধারণ বা অ্যারে-ফিল অপারেশন করতে হতে পারে:
const arr = new Array(5); // length = 5, all empty slots
const arr2 = new Array(1, 2, 3); // [1,2,3]
নোট: new Array(5) অনেক সময় বিভ্রান্তি সৃষ্টি করে (empty slots থাকে)। সাধারনত লিটারেল ব্যবহার করুন।
3. Array-এর প্রধান প্রকার (Types / Variants)
ভিত্তি থেকে Array আসলে একটাই ডেটা স্ট্রাকচার — তবে ব্যবহারভিত্তিক পার্থক্য আছে। নিচে জনপ্রিয় ভ্যারিয়েন্টগুলো দেওয়া হলো:
3.1. Normal (Generic) Arrays
সাধারণ [] লিটারেল — যেখানে বিভিন্ন টাইপ রাখাই যায়।
3.2. Sparse Arrays
যখন ইনডেক্সগুলোতে ডাটা অনিয়মিতভাবে থাকে বা কিছু এলিমেন্ট নেই — তা sparse array বলে। এটি কিছু অপারেশন-এ আশানুরূপ আচরণ দেখায়, তাই সাবধান থাকতে হবে।
3.3. Typed Arrays
যদি পারফরম্যান্স-সংবেদনশীল কাজ (bitwise manipulation, WebGL, audio processing) করতে হয়, তখন Typed Arrays (যেমন Int8Array, Float32Array) ব্যবহার করা উচিত। এইগুলো কন্টিগিউয়াস মেমরি ব্লক ব্যবহার করে এবং নির্দিষ্ট টাইপেই ডেটা রাখে — ফলে পারফরম্যান্স বাড়ে।
3.4. Multi-dimensional / Nested Arrays
একটি array-এ আরেকটি array রাখতে পারেন — matrix বা grid তৈরির জন্য ব্যবহৃত হয়।
4. Array-র সাধারণ মেথড ও ব্যবহার
Array মেথডগুলো খুবই শক্তিশালী। নিচে সবচেয়ে প্রয়োজনীয়গুলো এবং তারা কীভাবে কাজ করে — উদাহরণসহ দেওয়া হলো।
4.1. push, pop, shift, unshift (stack/queue ops)
const a = [1,2];
a.push(3); // [1,2,3]
a.pop(); // returns 3, a => [1,2]
a.unshift(0); // [0,1,2]
a.shift(); // returns 0, a => [1,2]
4.2. map, filter, reduce — ফাংশনাল স্টাইল
const nums = [1,2,3,4];
const squares = nums.map(n => n * n); // [1,4,9,16]
const evens = nums.filter(n => n % 2 === 0); // [2,4]
const sum = nums.reduce((acc, n) => acc + n, 0); // 10
4.3. slice & splice
slice immutable; splice mutable (in-place)।
const arr = [1,2,3,4,5];
const part = arr.slice(1,4); // [2,3,4], arr unchanged
arr.splice(2,1,99); // removes 1 el at index2, inserts 99 => arr: [1,2,99,4,5]
4.4. find, findIndex, includes
const users = [{id:1,name:'A'}, {id:2,name:'B'}];
const u = users.find(u => u.id === 2); // {id:2,name:'B'}
['a','b'].includes('b'); // true
5. Mutable vs Immutable আচরণ — কপি করার কৌশল
JavaScript arrays মূলত mutable — অর্থাৎ অনেক মেথড (push, pop, splice) মূল অ্যারের ওপর পরিবর্তন করে। কখনimmutable কপি দরকার? যখন আপনি রিএктив স্টেট (React state) বা predictable behavior চান।
শ্যালো কপি (Shallow copy)
// Spread operator or Array.from
const a = [1,2,3];
const copy = [...a]; // shallow copy
ডিপ কপি (Deep copy)
যদি array-এ nested objects থাকে, তাহলে শ্যালো কপি যথেষ্ট নয়। ডিপ কপির কিছু উপায়:
- JSON (সিম্পল, কিন্তু functions/date নয়):
JSON.parse(JSON.stringify(obj)) - StructuredClone() (নতুন এবং ভ্যালিড ব্রাউজারে সাপোর্ট করে):
structuredClone(obj) - লাইব্রেরি ব্যবহার (lodash.cloneDeep ইত্যাদি)
const nested = [{x:1, arr:[1,2]}];
const deep = structuredClone(nested);
6. Multi-dimensional arrays / Nested arrays
Matrix বা grid রিপ্রেজেন্ট করার জন্য nested arrays ব্যবহার করা হয়। সাধারণ উদাহরণ হলো 2D matrix।
// 2D array (matrix)
const matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
];
// Access center:
console.log(matrix[1][1]); // 5
Matrix operations (transpose, rotate) নিয়ে কাজ করলে nested loops বা map ব্যবহার করা সাধারণ। কোড উদাহরণ (transpose):
function transpose(m) {
return m[0].map((_, colIndex) => m.map(row => row[colIndex]));
}
7. Typed Arrays — কখন ও কেন ব্যবহার করবেন
Typed arrays (যেমন Uint8Array, Float32Array) ব্যবহার করলে আপনি contiguous memory ব্যবহার করে দ্রুত গাণিতিক বা বাইনারি অপারেশন করতে পারবেন। WebGL, audio processing, binary protocols ইত্যাদিতে অপরিহার্য।
const buf = new ArrayBuffer(16); // 16 bytes
const f32 = new Float32Array(buf); // view as floats
f32[0] = 1.5;
8. Common performance pitfalls এবং অপ্টিমাইজেশন
Array-সংক্রান্ত পারফরম্যান্স সমস্যা সাধারণত হয় অনুচিত অ্যাপিচার ব্যবহার, বারবার বড় অ্যারে রিসাইজ করা, বা অপ্রয়োজনীয় কপি। নীচে কয়েকটি টিপস:
- যদি অনেকগুলো push করতে হবে, প্রথমে approximate size জানলে
new Array(size)করে শুরু করুন (কখনও কখনও সাহায্য করে)। - avoid sparse arrays — এগুলো গতি ধীর করে।
- map/filter/reduce সাজেশন: chaining করলে মাঝে মাঝে একটি অতিরিক্ত অ্যারে তৈরি হতে পারে — বড় ডেটার ক্ষেত্রে ভেতরে single pass reduce ব্যবহার করুন।
- Typed arrays ব্যবহার করুন যদি বাইনারি বা সংখ্যাভিত্তিক অপারেশন অনেক হয়।
9. Array প্রাক্টিসিং: Map, Reduce, Filter — উদাহরণ
এই তিনটি মেথড functional paradigm-এ সবচেয়ে বেশি ব্যবহৃত। নিচে একটি বাস্তব উদাহরণ — একটি user list থেকে usernames যোগ করে comma-separated string তৈরি।
const users = [
{id:1, name:'A', active:true},
{id:2, name:'B', active:false},
{id:3, name:'C', active:true}
];
const activeNames = users
.filter(u => u.active)
.map(u => u.name)
.join(', '); // 'A, C'
// একই কাজ reduce দিয়ে (single pass)
const activeNamesReduce = users.reduce((acc, u) => {
if(u.active) acc.push(u.name);
return acc;
}, []).join(', ');
10. Real-world use-cases: UI, Data processing, APIs
Array ব্যবহৃত হয়:
- UI lists (React/Vue) — component rendering
- Data pipelines — mapping, aggregating, filtering API responses
- Algorithms — sorting, searching, graph adjacency lists
- Streams / pagination — chunking arrays
Example: Pagination (chunking)
function chunk(array, size=10) {
const result = [];
for(let i=0; i
11. Error handling এবং validation
Array-র সাথে কাজ করার সময় ইনপুট ভেরিফাই করা জরুরি। উদাহরণ: যদি API থেকে array না আসে, বা null আসে — তারপর সরাসরি map/call করলে error পাবে।
// Safe mapping
const safeMap = (arr, fn) => Array.isArray(arr) ? arr.map(fn) : [];
আরেকটি সাধারণ প্যাটার্ন — validate element type:
if (!Array.isArray(data)) throw new Error('Expected array');
data.forEach(item => {
if (typeof item !== 'object') throw new Error('Invalid item type');
});
12. Best practices
- Use const for arrays when reference doesn't change (you can still mutate contents).
- Prefer array methods that return new arrays in immutable codebases (e.g., React state updates).
- Avoid deep mutation of nested arrays; prefer pure functions or immutable libraries (Immer).
- Use descriptive variable names:
usersinstead ofu(unless local short loop). - Profile before optimizing: premature optimization is wasteful.
13. কোড স্নিপেটস ও Cheatsheet
| Operation | Example |
|---|---|
| Create array | const a = [1,2,3] |
| Shallow copy | const b = [...a] |
| Deep copy | const d = structuredClone(a) |
| Map | a.map(x => x*2) |
| Filter | a.filter(x => x%2===0) |
| Reduce | a.reduce((s,x)=>s+x,0) |
| Find | a.find(x => x.id===3) |
14. সারাংশ ও উপসংহার
JavaScript array হলো শক্তিশালী এবং বহুমুখী ডেটা স্ট্রাকচার। সঠিকভাবে ব্যবহার করলে এটি আপনার কোডকে পরিষ্কার, কার্যকর এবং দ্রুত বানায়। মূল কথা: লিটারেল দিয়ে শুরু করুন, immutable patterns প্রয়োজনে কপি ব্যবহার করুন, এবং পারফরম্যান্স-সংবেদনশীল কাজ হলে Typed Arrays বিবেচনা করুন। Map/Filter/Reduce শিখলে ডাটা ট্রান্সফর্ম করা সহজ হয়।
15. Frequently Asked Questions (FAQ)
Q1: Array কি object নাকি primitive?
A: Array হলো একটি object (typeof [] === 'object') — কিন্তু সেটি special behavior প্রদর্শন করে যেমন length property এবং indexable elements।
Q2: কিভাবে array-কে immutable রাখা যায়?
A: প্রতিটি পরিবর্তনের জন্য নতুন array তৈরি করুন — যেমন spread operator, map/filter, অথবা Immutable.js/Immer লাইব্রেরি ব্যবহার করুন।
Q3: Sparse array কি? সমস্যা কি?
A: Sparse array হলো যেখানে কিছু ইনডেক্সে মান নেই (holes)। এগুলো iteration-এ অপ্রত্যাশিত ফল দিতে পারে এবং পারফরম্যান্স ক্ষতিগ্রস্ত করে।
Q4: TypedArray কখন ব্যবহার করব?
A: যখন আপনি নির্দিষ্ট টাইপের কাঁচা (binary) ডেটা নিয়ে কাজ করছেন যেমন WebGL, audio processing, অথবা large numeric computations।
Q5: Array.copyWithin() কি করে?
A: copyWithin() একটি অ্যারে-র অংশকে একই অ্যারের অন্য স্থানে কপি করে (in-place)। এটি destructive method।
আরও রিসোর্স: MDN Web Docs (Array), JavaScript.info (Arrays) — এইগুলো দেখলে আপনি আরো গভীরে যেতে পারবেন।
শেষ কথা: নিয়মিত প্র্যাকটিস করুন — ছোট ছোট প্রকল্পে array-heavy কাজ রাখলে দক্ষতা দ্রুত বাড়বে।