`অ্যারে` অবজেক্ট

এই প্রবন্ধে অ্যারে অবজেক্ট সম্পর্কে ব্যাখ্যা করা হয়েছে।

আমি সহজ ভাষায় ধাপে ধাপে অ্যারের ব্যবহারিক প্রয়োগ ব্যাখ্যা করবো।

YouTube Video

অ্যারে অবজেক্ট

জাভাস্ক্রিপ্টের অ্যারে অবজেক্ট হলো বিভিন্ন ধরনের ডেটা প্রসেসিংয়ের সবচেয়ে গুরুত্বপূর্ণ ভিত গঠিত কাঠামোগুলোর মধ্যে একটি। মৌলিক অ্যারে অপারেশন থেকে শুরু করে উন্নত ডেটা রূপান্তরের জন্য দরকারি উচ্চ-স্তরের ফাংশন পর্যন্ত, জানা উচিত এমন অনেক বৈশিষ্ট্য আছে।

অ্যারের মৌলিক বিষয়াবলি

জাভাস্ক্রিপ্টে, অ্যারে হচ্ছে বহু মান একসাথে ব্যবহারের জন্য মৌলিক ডেটা স্ট্রাকচার। এখানে, আমরা অ্যারে তৈরির এবং তাদের উপাদানগুলো পড়া ও লেখা সহজ উদাহরণসহ ব্যাখ্যা করছি।

 1// Create arrays in different ways
 2const arr1 = [1, 2, 3];           // array literal
 3const arr2 = new Array(4, 5, 6);  // Array constructor
 4const arr3 = Array.of(7, 8, 9);   // Array.of
 5
 6console.log("arr1 created with literal.   :", arr1);
 7console.log("arr2 created with constructor:", arr2);
 8console.log("arr3 created with Array.of.  :", arr3);
 9// arr1 created with literal.   : [ 1, 2, 3 ]
10// arr2 created with constructor: [ 4, 5, 6 ]
11// arr3 created with Array.of.  : [ 7, 8, 9 ]
12
13// Access and modify elements
14let first = arr1[0];              // read element
15console.log("First element of arr1:", first);
16// First element of arr1: 1
17
18arr1[1] = 20;                     // modify element
19console.log("arr1 after modifying index 1:", arr1);
20// arr1 after modifying index 1: [ 1, 20, 3 ]
21
22const len = arr1.length;          // get length
23console.log("Length of arr1:", len);
24// Length of arr1: 3
  • এই কোডটি অ্যারে তৈরির তিনটি উপায়, ইন্ডেক্স ব্যবহার করে উপাদান পড়া ও আপডেট করার উপায় এবং length প্রপার্টি ব্যবহার করে অ্যারের দৈর্ঘ্য জানার উপায় দেখায়।
  • অ্যারে লিটারালগুলি সবচেয়ে সাধারণ এবং পাঠযোগ্য, এবং দৈনন্দিন পরিস্থিতিতে সবচেয়ে বেশি ব্যবহৃত হয়।

উপাদান যোগ ও বাদ দেওয়া (শেষে বা শুরুতে)

অ্যারে আপনাকে সহজেই শেষে বা শুরুতে উপাদান যোগ অথবা বাদ দেওয়ার সুযোগ দেয়। এসব অপারেশন স্ট্যাক বা কিউ-এর মতো স্ট্রাকচার ইমপ্লিমেন্টে বিশেষভাবে উপযোগী।

 1// Push and pop (stack-like)
 2const stack = [];
 3console.log("Initial stack:", stack);
 4
 5stack.push(1);                    // push 1
 6console.log("After push(1):", stack);
 7
 8stack.push(2);                    // push 2
 9console.log("After push(2):", stack);
10
11const last = stack.pop();         // pop -> 2
12console.log("Popped value:", last);
13console.log("Stack after pop():", stack);
14
15// Unshift and shift (queue-like)
16const queue = [];
17console.log("Initial queue:", queue);
18
19queue.push('a');                  // add to end
20console.log("After push('a'):", queue);
21
22queue.unshift('start');           // add to front
23console.log("After unshift('start'):", queue);
24
25const firstItem = queue.shift();  // remove from front
26console.log("Shifted value:", firstItem);
27console.log("Queue after shift():", queue);
28
29// Initial stack: []
30// After push(1): [ 1 ]
31// After push(2): [ 1, 2 ]
32// Popped value: 2
33// Stack after pop(): [ 1 ]
34
35// Initial queue: []
36// After push('a'): [ 'a' ]
37// After unshift('start'): [ 'start', 'a' ]
38// Shifted value: start
39// Queue after shift(): [ 'a' ]
  • pushpop অ্যারের শেষে কাজ করে। স্ট্যাক স্ট্রাকচার তৈরি করার জন্য এগুলো আদর্শ।
  • unshiftshift অ্যারের শুরুতে কাজ করে। তবে, মনে রাখবেন যে শুরুতে কাজ করলে সকল উপাদানের ইন্ডেক্স পরিবর্তন করতে হয়, ফলে এটি অপেক্ষাকৃত ব্যয়বহুল অপারেশন।

মাঝের উপাদান নিয়ন্ত্রণ (splice এবং slice)

অ্যারের মাঝের উপাদান নিয়ে কাজ করার সময়, মূল অ্যারে পরিবর্তন করতে চান কি না তার উপর ভিত্তি করে splice অথবা slice বেছে নিন। আপনি যদি কেবল একটি অ্যারের অংশ বের করতে চান, তাহলে slice ব্যবহার করুন; যদি আপনি অ্যারেটি সংশোধন করতে চান, যেমন এলিমেন্ট যোগ বা মুছে ফেলা, তাহলে splice ব্যবহার করুন।

 1// slice (non-destructive)
 2const nums = [0, 1, 2, 3, 4];
 3console.log("Original nums:", nums);
 4
 5const part = nums.slice(1, 4); // returns [1, 2, 3]
 6console.log("Result of nums.slice(1, 4):", part);
 7console.log("nums after slice (unchanged):", nums);
 8
 9// splice (destructive)
10const arr = [10, 20, 30, 40];
11console.log("\nOriginal arr:", arr);
12
13// remove 1 item at index 2, insert 25 and 27
14arr.splice(2, 1, 25, 27);
15console.log("After arr.splice(2, 1, 25, 27):", arr);
16
17// Original nums: [ 0, 1, 2, 3, 4 ]
18// Result of nums.slice(1, 4): [ 1, 2, 3 ]
19// nums after slice (unchanged): [ 0, 1, 2, 3, 4 ]
20
21// Original arr: [ 10, 20, 30, 40 ]
22// After arr.splice(2, 1, 25, 27): [ 10, 20, 25, 27, 40 ]
  • slice কেবল উপাদান বের করে এবং মূল অ্যারে কোনোভাবেই পরিবর্তন করে না।
  • splice উপাদান যোগ বা বাদ দেয় এবং মূল অ্যারে পরিবর্তন করে, তাই এর কার্যকারিতার দিকে বিশেষভাবে সতর্ক থাকুন।

ইটারেশন (for / for...of / forEach)

ধাপে ধাপে অ্যারে প্রসেস করার অনেক পদ্ধতি আছে, এবং আপনি আপনার উদ্দেশ্য ও কোডিং স্টাইল অনুযায়ী বেছে নিতে পারেন। এখানে তিনটি সাধারণ লুপ গঠন দেখানো হল।

 1const items = ['apple', 'banana', 'cherry'];
 2console.log("Items:", items);
 3
 4// classic for
 5console.log("\n--- Classic for loop ---");
 6for (let i = 0; i < items.length; i++) {
 7  console.log(`Index: ${i}, Value: ${items[i]}`);
 8}
 9
10// for...of (recommended for values)
11console.log("\n--- for...of loop ---");
12for (const item of items) {
13  console.log(`Value: ${item}`);
14}
15
16// forEach (functional style)
17console.log("\n--- forEach loop ---");
18items.forEach((item, index) => {
19  console.log(`Index: ${index}, Value: ${item}`);
20});
  • for লুপ সবচেয়ে নমনীয়, কারণ এতে ইন্ডেক্স অপারেশন ও break ব্যবহারের মাধ্যমে ইটারেশনে নিয়ন্ত্রন রাখা যায়।
  • for...of অত্যন্ত সংক্ষিপ্তভাবে উপাদান মান ব্যবহারে সাহায্য করে এবং পড়ার দিক থেকে সবচেয়ে ব্যালান্সড।
  • forEach ফাংশনাল-স্টাইল কোডিং-এর জন্য উপযোগী এবং প্রতিটি উপাদানের জন্য লগিং বা ডেটা আপডেটের মতো সাইড-ইফেক্ট অপারেশনে ভালো কাজ করে। তবে, মনে রাখবেন এখানে break বা continue ব্যবহার করা যায় না, এবং এটি await-সহ অ্যাসিনক্রোনাস প্রসেসিংয়ের জন্য উপযুক্ত নয়

map / filter / reduce — উচ্চ-স্তরের ফাংশনসমূহ

map, filter এবং reduce হচ্ছে হায়ার-অর্ডার ফাংশন, যা প্রায়ই অ্যারে পরিবর্তন, ফিল্টার অথবা একত্রিত করার সময় ব্যবহৃত হয়। কারণ আপনি পুনরাবৃত্তিমূলক প্রসেসিং স্পষ্টভাবে প্রকাশ করতে পারেন, আপনার কোড সহজ ও বোধগম্য হয়।

 1const numbers = [1, 2, 3, 4, 5];
 2console.log("Original numbers:", numbers);
 3
 4// map: transform each item
 5const doubled = numbers.map(n => n * 2);
 6console.log("\nResult of map (n * 2):", doubled);
 7
 8// filter: select items
 9const evens = numbers.filter(n => n % 2 === 0);
10console.log("Result of filter (even numbers):", evens);
11
12// reduce: accumulate to single value
13const sum = numbers.reduce((acc, n) => acc + n, 0);
14console.log("Result of reduce (sum):", sum);
15
16// Original numbers: [ 1, 2, 3, 4, 5 ]
17// Result of map (n * 2): [ 2, 4, 6, 8, 10 ]
18// Result of filter (even numbers): [ 2, 4 ]
19// Result of reduce (sum): 15
  • এসব পদ্ধতি ডিক্লারেটিভ স্টাইলে আপনি যা করতে চান সেখানে ফোকাস করতে দেয়, পড়ার সুবিধা বাড়ায় এবং অবাঞ্চিত সাইড-ইফেক্ট এড়াতে সাহায্য করে।

find / findIndex / some / every

এখানে অনুসন্ধান এবং শর্ত যাচাইয়ের কিছু পদ্ধতির সংক্ষিপ্ত বিবরণ দেয়া হল। এসব পদ্ধতি নির্দিষ্ট শর্তে উপাদান খুঁজে পেতে বা সেটে বুলিয়ান চেক করতে কাজে লাগে।

 1const users = [
 2  { id: 1, name: 'Alice' },
 3  { id: 2, name: 'Bob' },
 4  { id: 3, name: 'Carol' }
 5];
 6
 7console.log("Users:", users);
 8
 9// Find the first user whose name is 'Bob'
10const bob = users.find(user => user.name === 'Bob');
11console.log("\nResult of find (name === 'Bob'):", bob);
12
13// Find index of the user whose id is 3
14const indexOfId3 = users.findIndex(user => user.id === 3);
15console.log("Result of findIndex (id === 3):", indexOfId3);
16
17// Check if there exists a user with id = 2
18const hasId2 = users.some(user => user.id === 2);
19console.log("Result of some (id === 2):", hasId2);
20
21// Check if all users have a numeric id
22const allHaveNumericId = users.every(user => typeof user.id === 'number');
23console.log("Result of every (id is number):", allHaveNumericId);
24// Result of find (name === 'Bob'): { id: 2, name: 'Bob' }
25// Result of findIndex (id === 3): 2
26// Result of some (id === 2): true
27// Result of every (id is number): true
  • find প্রথম যেই উপাদান শর্ত পূরণ করে সেটি ফেরত দেয়।
  • findIndex শর্ত পূরণকারী উপাদানের ইন্ডেক্স দেয়।
  • some অন্তত একটি উপাদান শর্ত পূরণ করলে true দেয়।
  • every সব উপাদান শর্ত পূরণ করলে true দেয়।

এসব পদ্ধতি অ্যারে প্রসেসিংয়ে খুবই কার্যকরী, তাই উপযুক্তভাবে ব্যবহার করলে কোড সংক্ষিপ্ত ও পরিষ্কার থাকবে।

সর্টিং ও তুলনা ফাংশন

অ্যারে sort ব্যবহার করে সর্ট করা হয়, তবে ডিফল্টভাবে এটি উপাদানগুলোকে স্ট্রিং হিসেবে তুলনা করে—ফলে সংখ্যা সর্টিংয়ে অপ্রত্যাশিত ফল আসতে পারে।

 1const nums = [10, 2, 33, 4];
 2console.log("Original nums:", nums);
 3
 4// Default sort: compares elements as strings (not suitable for numbers)
 5nums.sort();
 6console.log("\nAfter default sort (string comparison):", nums);
 7
 8// Numeric ascending sort using a compare function
 9nums.sort((a, b) => a - b);
10console.log("After numeric sort (a - b):", nums);
11
12// Sort objects by a property
13const people = [{ age: 30 }, { age: 20 }, { age: 25 }];
14console.log("\nOriginal people:", people);
15
16people.sort((a, b) => a.age - b.age);
17console.log("After sorting people by age:", people);
18
19// After default sort (string comparison): [ 10, 2, 33, 4 ]
20// After numeric sort (a - b): [ 2, 4, 10, 33 ]
21// Original people: [ { age: 30 }, { age: 20 }, { age: 25 } ]
22// After sorting people by age: [ { age: 20 }, { age: 25 }, { age: 30 } ]
  • সংখ্যা অথবা অবজেক্ট সর্ট করার সময় অবশ্যই তুলনা ফাংশন ব্যবহার করুন যাতে কাঙ্ক্ষিতভাবে সর্ট হয়।
  • তুলনা ফাংশনে, নেগেটিভ হলে a আগে আসবে, পজিটিভ হলে b আগে আসবে, আর 0 হলে তাদের অবস্থান অপরিবর্তিত থাকে।

অ্যারে কপি ও অপরিবর্তনীয়তা

অ্যারে কপি করার সময়, 'রেফারেন্স কপি' এবং 'শ্যালো কপি'-র পার্থক্য বোঝা গুরুত্বপূর্ণ। বিশেষ করে, যদি অ্যারের মধ্যে অবজেক্ট থাকে, তাহলে শ্যালো কপি করা হলে ওই অবজেক্টগুলো দুই অ্যারেতেই অব্যবহৃত থাকবে।

রেফারেন্স কপি

আপনি যখন কোন অ্যারে অন্য একটি ভ্যারিয়েবলে এসাইন করেন, তখন অ্যারেটি নিজে ডুপ্লিকেট হয় না; বরং একই অ্যারেটির প্রতি নির্দেশকারী 'রেফারেন্স'টি কপি হয়।

 1const a = [1, 2, 3];
 2console.log("Original a:", a);
 3
 4// Reference copy; modifying b also affects a
 5const b = a;
 6console.log("\nReference copy b = a:", b);
 7// Reference copy b = a: [ 1, 2, 3 ]
 8
 9b[0] = 100;
10console.log("After modifying b[0] = 100:");
11console.log("a:", a);  // a: [ 100, 2, 3 ] (affected)
12console.log("b:", b);  // b: [ 100, 2, 3 ]
  • রেফারেন্স কপির ক্ষেত্রে, আপনি যদি কপিকৃত ভ্যারিয়েবল ব্যবহার করে অ্যারের বিষয়বস্তু পরিবর্তন করেন, সেই পরিবর্তনগুলি একই অ্যারেকে নির্দেশ করা মূল ভ্যারিয়েবলেও প্রতিফলিত হবে।

শ্যালো কপি

slice() অথবা স্প্রেড সিনট্যাক্স ব্যবহার করলে একটি 'শ্যালো কপি' তৈরি হয়, কারণ শুধুমাত্র মানগুলো ডুপ্লিকেট হয়; মূল ও কপিকৃত অ্যারেগুলো আলাদা হিসেবে গণ্য হয়।

 1const a = [1, 2, 3];
 2console.log("Original a:", a);
 3
 4// Shallow copy (new array)
 5const b = a.slice();
 6console.log("\nShallow copy using slice():", b);
 7// Shallow copy using slice(): [ 100, 2, 3 ]
 8
 9const c = [...a];
10console.log("Shallow copy using spread [...a]:", c);
11// Shallow copy using spread [...a]: [ 100, 2, 3 ]
12
13// Modifying c or d does NOT affect a
14b[1] = 200;
15c[2] = 300;
16console.log("\nAfter modifying b[1] = 200 and c[2] = 300:");
17console.log("a:", a);   // [ 100, 2, 3 ]
18console.log("b:", b);   // [ 100, 200, 3 ]
19console.log("c:", c);   // [ 100, 2, 300 ]
  • এই কোডটি দেখায়, slice() অথবা স্প্রেড সিনট্যাক্স দ্বারা তৈরি শ্যালো কপি মূল অ্যারেকে প্রভাবিত করে না।

শ্যালো কপি এবং অপরিবর্তনীয়তা

আপনি যদি 'শ্যালো কপি' ব্যবহার করে অ্যারে ডুপ্লিকেট করেন, তবুও যদি অ্যারেটির ভিতরে অবজেক্ট থাকে তবে অনাকাঙ্ক্ষিত শেয়ারিং হতে পারে।

 1// Shallow copy doesn't clone inner objects
 2const nested = [{ x: 1 }, { x: 2 }];
 3console.log("\nOriginal nested:", nested);
 4// Original nested: [ { x: 1 }, { x: 2 } ]
 5
 6const shallow = nested.slice();
 7console.log("Shallow copy of nested:", shallow);
 8// Shallow copy of nested: [ { x: 1 }, { x: 2 } ]
 9
10// Changing inner object affects both arrays
11shallow[0].x = 99;
12console.log("\nAfter shallow[0].x = 99:");
13console.log("nested:", nested);
14console.log("shallow:", shallow);
15// nested: [ { x: 99 }, { x: 2 } ]
16// shallow: [ { x: 99 }, { x: 2 } ]
  • এই কোডটি দেখায় যে, শ্যালো কপির ক্ষেত্রে ভিতরের অবজেক্টগুলো শেয়ার করা থাকে, তাই সেই অবজেক্টগুলো পরিবর্তন করলে মূল অ্যারে এবং কপি উভয়টিতেই প্রভাব পড়ে।
  • আপনার যদি স্বতন্ত্র ডেটা দরকার, তাহলে structuredClone() বা JSON রূপান্তরের মতো 'ডিপ কপি' দরকার হবে।

উপকারী ইউটিলিটি মেথডসমূহ

নিচেরগুলো হলো অ্যারে নিয়ে কাজ করার সময় বহুল ব্যবহৃত ইউটিলিটি পদ্ধতি। আপনার কাজে এগুলোর যথাযথ ব্যবহার করলে ছোট এবং পড়তে সুবিধাজনক কোড লেখা যায়।

includes

includes মেথডটি পরীক্ষা করে একটি নির্দিষ্ট মান অ্যারেতে আছে কিনা।

1// includes: check if array contains a value
2const letters = ['a', 'b', 'c'];
3const hasB = letters.includes('b');
4console.log("letters:", letters);  // [ 'a', 'b', 'c' ]
5console.log("letters.includes('b'):", hasB); // true
  • এই কোডে, includes মেথড ব্যবহার করে সংক্ষেপে নির্ধারণ করা হয়েছে নির্দিষ্ট মানটি অ্যারেতে আছে কিনা।

concat

concat মেথড একটি নতুন অ্যারে রিটার্ন করে, যেখানে নির্দিষ্ট অ্যারে অথবা মানগুলো শেষে যোগ করা হয়, এবং মূল অ্যারে অপরিবর্তিত থাকে।

1// concat: merge arrays without mutation
2const a1 = [1, 2];
3const a2 = [3, 4];
4const combined = a1.concat(a2);
5console.log("a1.concat(a2):", combined); // [ 1, 2, 3, 4 ]
6console.log("a1(unchanged):", a1);       // [ 1, 2 ]
  • এই কোডটি দেখায় যে concat ডেটা নষ্ট করে না, বরং মূল অ্যারে ঠিক রেখে নতুন অ্যারে তৈরি করতে দেয়।

flat

flat মেথড ব্যবহার করে আপনি নেস্টেড অ্যারে সমতল করতে পারেন।

1// flat and flatMap: flatten arrays or map + flatten in one step
2const nested = [1, [2, [3]]];
3console.log("nested:", nested); // nested: [ 1, [ 2, [ 3 ] ] ]
4console.log("nested.flat():", nested.flat()); // default depth = 1
5// nested.flat(): [ 1, 2, [ 3 ] ]
  • এই কোডটি দেখায় কিভাবে একটি অ্যারে এক স্তর পর্যন্ত সমতল করা হয়।
  • flat আপনাকে ডেপথ নির্ধারণ করতে দেয়, তাই আপনি প্রয়োজন অনুযায়ী নমনীয়ভাবে নেস্টিং সরাতে পারেন।

flatMap

flatMap মেথড প্রতিটি এলিমেন্টে ট্রান্সফর্মেশন প্রয়োগ করে এবং তারপর স্বয়ংক্রিয়ভাবে ফলাফলগুলোকে একমাত্রিক অ্যারেতে সমতল করে।

1// flat and flatMap: flatten arrays or map + flatten in one step
2const words = ['hello world', 'hi'];
3console.log("words:", words); // [ 'hello world', 'hi' ]
4
5const splitWords = words.flatMap(w => w.split(' '));
6console.log("words.flatMap(w => w.split(' ')):", splitWords);
7// words.flatMap(w => w.split(' ')): [ 'hello', 'world', 'hi' ]
  • এই কোডে দেখানো হয়েছে কিভাবে অ্যারেতে থাকা প্রতিটি স্ট্রিং স্পেস দ্বারা ভাগ করা হয়েছে এবং ফলাফলগুলো একত্র করে একটিমাত্র অ্যারে হিসেবে সমতল করা হয়েছে।

join

join মেথড একটি নির্দিষ্ট সেপারেটর দিয়ে অ্যারের এলিমেন্টগুলোকে যুক্ত করে একটি স্ট্রিং তৈরি করে।

1// join: combine elements into a string with a separator
2const csv = ['a', 'b', 'c'].join(',');
3console.log("['a', 'b', 'c'].join(','):", csv);  // a,b,c
  • এই কোডে, join মেথড ব্যবহার করে একটি অ্যারেকে কমা দ্বারা বিচ্ছিন্ন স্ট্রিংয়ে রূপান্তর করা হয়েছে।

সাধারণ ভুল-ত্রুটি

প্রথম দর্শনে অ্যারে অপারেশন সহজ মনে হলেও কিছু বিষয় আছে যা সহজেই অনিচ্ছাকৃত আচরণ সৃষ্টি করতে পারে। দৈনন্দিন অ্যারে অপারেশনে অনেক ভুল চোখ এড়িয়ে যেতে পারে, তাই নিচের বিষয়গুলি খেয়াল রাখলে কোডের নির্ভরযোগ্যতা বাড়বে।

  • Array-এর sort() ডিফল্টভাবে স্ট্রিং হিসেবে তুলনা করে সর্ট করে। সংখ্যা সঠিকভাবে সর্ট করতে হলে অবশ্যই তুলনা ফাংশন ব্যবহার করুন।
  • অ্যারে কপি করা (slice বা স্প্রেড সিনট্যাক্স ইত্যাদি দিয়ে) শ্যালো কপি তৈরি করে। যদি অ্যারে-তে অবজেক্ট থাকে, সাবধান থাকুন কারণ অ্যারের ডেটা অনিচ্ছাকৃতভাবে পরিবর্তিত হতে পারে।
  • splice হলো ধ্বংসাত্মক পদ্ধতি যা সরাসরি অ্যারে পরিবর্তন করে, আর slice হলো আধা-ধ্বংসাত্মক নয়, মূল অ্যারে অপরিবর্তিত রাখে। আপনার প্রয়োজনে এগুলো যথাযথভাবে ব্যবহার করা জরুরি।
  • forEach await-সহ অ্যাসিনক্রোনাস লুপের জন্য উপযুক্ত নয়। সঠিক ভাবে অ্যাসিনক্রোনাস প্রসেস পরিকল্পিতভাবে চালাতে চাইলে for...of ব্যবহার করা সুপারিশ করা হয়।

ব্যবহারিক উদাহরণ

নিচে একটি উদাহরণ দেখানো হয়েছে যেখানে অ্যারে মেথড একত্র করে 'ইউজার ডেটা থেকে মোট বয়স পাওয়া, ৩০ বা তার বেশি বয়সীদের বের করা এবং তাদের নামের তালিকা তৈরি' করা হয়েছে।

 1const users = [
 2  { name: 'Alice', age: 28 },
 3  { name: 'Bob', age: 34 },
 4  { name: 'Carol', age: 41 },
 5  { name: 'Dave', age: 19 }
 6];
 7
 8console.log("Users:", users);
 9
10// sum ages
11const totalAge = users.reduce((acc, u) => acc + u.age, 0);
12console.log("\nTotal age of all users:", totalAge);
13// Total age of all users: 122
14
15// filter and map names of users 30 and older
16const namesOver30 = users
17  .filter(u => u.age >= 30)
18  .map(u => u.name);
19
20console.log("Users aged 30 or older (names):", namesOver30);
21// Users aged 30 or older (names): [ 'Bob', 'Carol' ]
  • reduce, filter, এবং map একত্রে চেইন করে ডেটা সংগ্রহ, শর্ত অনুযায়ী বাছাই এবং রূপান্তর সহজেই লেখা সম্ভব।
  • এমন 'ডেটা প্রসেসিং পাইপলাইন' খুবই পড়তে সহজ এবং কম সাইড-ইফেক্ট থাকার কারণে বাস্তব অ্যাপে বেশি ব্যবহৃত হয়।

সারসংক্ষেপ

জাভাস্ক্রিপ্ট অ্যারে দিয়ে মৌলিক অপারেশনও ব্যাপকভাবে ব্যবহারযোগ্য, এবং উচ্চ-স্তরের ফাংশন ব্যবহার করলে কোড আরও সংক্ষিপ্ত ও অর্থবহ হয়। অনুধাবনের অনেক বিষয় রয়েছে, তবে একবার উপযুক্তভাবে ব্যবহারে দক্ষ হলে ডেটা প্রসেসিং অনেক সহজ হবে।

আপনি আমাদের ইউটিউব চ্যানেলে ভিজ্যুয়াল স্টুডিও কোড ব্যবহার করে উপরের নিবন্ধটি অনুসরণ করতে পারেন। দয়া করে ইউটিউব চ্যানেলটিও দেখুন।

YouTube Video