সংক্ষিপ্ত বিবরণ: এই নিবন্ধে আমরা 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:
users
instead 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 কাজ রাখলে দক্ষতা দ্রুত বাড়বে।