ট্র্যাক
/
JavaScript
JavaScript
/
অনুশীলনী
/
এলিসের রূপান্তরী জাদু
এলিসের রূপান্তরী জাদু

এলিসের রূপান্তরী জাদু

লার্নিং অনুশীলনী

ভূমিকা

JavaScript-এ Array ক্লাসে অ্যারে রূপান্তরের জন্য অনেক শক্তিশালী বিল্ট-ইন মেথড আছে। একটি সাধারণ for লুপ বা আরও সরাসরি ম্যানিপুলেশন ব্যবহার করার চেয়ে এই মেথডগুলো একটি অ্যারে থেকে আরেকটি অ্যারে রূপান্তর করা অনেক সহজ করে তোলে।

কিছু মেথড পিওর, অর্থাৎ এগুলো মূল অ্যারেটি পরিবর্তন করে না। বদলে এগুলো একটি নতুন অ্যারে রিটার্ন করে। তবে অন্য কিছু মেথড যে অ্যারের ওপর কল করা হয় সেটিই বদলে দেয় এবং পরিবর্তিত অ্যারেটি রিটার্ন করে না।

অ্যারে রূপান্তরের জন্য সবচেয়ে বেশি ব্যবহৃত কিছু মেথড নিচে দেওয়া হলো। উপলব্ধ সব মেথডের পূর্ণ তালিকা পাওয়া যাবে MDN ডকুমেন্টেশন-এ।

map (পিওর)

আর্গুমেন্ট হিসেবে পাস করা একটি ফাংশন অনুযায়ী প্রতিটি এলিমেন্ট রূপান্তর করে একটি নতুন অ্যারে তৈরি করে। এই কলব্যাক ফাংশনগুলো প্রায়ই অ্যারো ফাংশন হিসেবে লেখা হয়।

let arr = [1, 2, 3, 4];

const newArr = arr.map((value) => value - 1);
console.log(newArr);
// => [0, 1, 2, 3]
console.log(arr);
// => [1, 2, 3, 4]

উল্লেখ করা ভালো যে, ফলাফল অ্যারেটির দৈর্ঘ্য সর্বদা মূল অ্যারেটির সমান হবে।

filter (পিওর)

একটি ফিল্টারিং ফাংশন দিলে (যা এলিমেন্টটি রাখা উচিত হলে ট্রু এবং সরিয়ে ফেলা উচিত হলে ফলস রিটার্ন করে) বর্তমান অ্যারেটি ফিল্টার করে একটি অ্যারে তৈরি করে।

let arr = [1, 2, 3, 4];

arr.filter((value) => value % 2 === 0);
// => [2, 4]

reduce (পিওর)

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

let arr = [1, 2, 3, 4];

// Get the sum of elements
arr.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
// => 10

// Classify the numbers by whether they are odd or not
arr.reduce(
  (accumulator, currentValue) => {
    if (currentValue % 2 === 0) {
      accumulator.even.push(currentValue);
    } else {
      accumulator.odd.push(currentValue);
    }

    return accumulator;
  },
  { even: [], odd: [] },
);
// => { even: [2, 4], odd: [1, 3] }

reverse

একটি অ্যারের এলিমেন্টগুলোর ক্রম উল্টে দেয়।

const arr = [1, 2, 3, 4];

arr.reverse();
// => [4, 3, 2, 1]

এই মেথডটি যে অ্যারের ওপর কল করা হয় সেটি পরিবর্তন করে।

slice (পিওর)

একটি শুরু ও শেষ ইনডেক্স দিলে, প্যারামিটার হিসেবে পাস করা অ্যারে থেকে একটি সাব-অ্যারে তৈরি করে।

শেষ ইনডেক্সের এলিমেন্টটি অন্তর্ভুক্ত হবে না। এছাড়া সব প্যারামিটারই ঐচ্ছিক: শুরু ইনডেক্সের ডিফল্ট মান 0, আর শেষ ইনডেক্সের ডিফল্ট মান অ্যারেটির দৈর্ঘ্য।

const arr = [1, 2, 3, 4];

arr.slice(1, 2); // [2]
arr.slice(1); // [2, 3, 4]
// You can also use negative numbers, that represent the indexes
// starting from the end of the array
arr.slice(-2); // [3, 4]

splice

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

এটি নিচের প্যারামিটারগুলো নেয়:

  • অ্যারে পরিবর্তন শুরু করার এলিমেন্টের ইনডেক্স
  • মুছে ফেলার এলিমেন্টের সংখ্যা
  • অ্যারেতে যোগ করার এলিমেন্টগুলো (ঐচ্ছিক)

splice সরিয়ে ফেলা এলিমেন্টগুলো রিটার্ন করে।

const arr = ['1', '2', '5', '6'];

// Insert an element at index 2
arr.splice(2, 0, '3');
console.log(arr);
// => ['1', '2', '3', '5', '6']

// Remove 2 elements, starting at index 3 and insert 2 elements
const removed = arr.splice(3, 2, '4', '5');
console.log(removed);
// => ['5', '6']
console.log(arr);
// => ['1', '2', '3', '4', '5']

// Remove 1 element at index 1
arr.splice(1, 1);
console.log(arr);
// => ['1', '3', '4', '5']

sort

ডিফল্টভাবে sort একটি অ্যারের এলিমেন্টগুলোকে প্রথমে স্ট্রিং-এ রূপান্তর করে এবং তারপর স্ট্রিং তুলনা প্রয়োগ করে সাজায় (দেখুন কনসেপ্ট তুলনা)। সাজানো হয় ইন-প্লেস, অর্থাৎ মূল অ্যারেটিই পরিবর্তিত হয়। sort ওই পরিবর্তিত অ্যারেটিই রিটার্ন করে, যা আপনি যদি এর সাথে অন্য মেথড চেইন করতে চান তাহলে সুবিধাজনক।

const arr = ['c', 'a', 'z', 'b'];
const result = arr.sort();
console.log(result);
// => ['a', 'b', 'c', 'z']
console.log(arr);
// => ['a', 'b', 'c', 'z']

সাজানোর ধরন নিজের মতো সাজাতে চাইলে আপনি আর্গুমেন্ট হিসেবে একটি তুলনা ফাংশন পাস করতে পারেন। তুলনা ফাংশনটিকে দুটি আর্গুমেন্ট দিয়ে কল করা হয়, যেগুলো অ্যারেটির দুটি এলিমেন্ট। এরপর এটিকে নিচের মানগুলো রিটার্ন করতে হবে:

  • প্রথম আর্গুমেন্টটি দ্বিতীয়টির আগে সাজানো উচিত হলে একটি ঋণাত্মক সংখ্যা
  • প্রথম আর্গুমেন্টটি দ্বিতীয়টির পরে সাজানো উচিত হলে একটি ধনাত্মক সংখ্যা
  • এলিমেন্টগুলোর ক্রম একই থাকা উচিত হলে 0

অবজেক্টের অ্যারে সাজাতে একটি কাস্টম তুলনা ফাংশন কীভাবে ব্যবহার করা যায় তার একটি উদাহরণ এখানে।

const arr = [
  { name: 'Lydia', age: 7 },
  { name: 'Anne', age: 34 },
  { name: 'Holger', age: 59 },
];

arr.sort((item1, item2) => {
  if (item1.name < item2.name) {
    return -1;
  }
  if (item1.name > item2.name) {
    return 1;
  }
  return 0;
});
// => [ { name: 'Anne', age: 34 }, { name: 'Holger', age: 59 },
// { name: 'Lydia', age: 7 } ]

নির্দেশনা

Elyse, ভবিষ্যতের জাদুকর, তার প্রশিক্ষণ চালিয়ে যাচ্ছে। তাকে তাসের একটি ডেক দেওয়া হবে এবং সে সেই ডেক রূপান্তর করার চেষ্টা করবে। সে নির্দিষ্ট কিছু তাস হাজির করবে, উধাও করবে, তাদের মান বদলাবে, বা তাদের সম্পূর্ণ নতুন করে সাজাবে। সহজ করার জন্য, সে সাধারণত ১ থেকে ১০ নম্বরের তাস দিয়েই শুরু করে, যদিও কিছু কৌশলের ফলে বড় তাস তৈরি হতে পারে।

1. প্রতিটি তাসের মান দ্বিগুণ করুন

Elyse ডেকের প্রতিটি তাসের সংখ্যা দ্বিগুণ করতে চায়। এর ফলে ১-১০-এর চেয়ে বড় তাস তৈরি হতে পারে।

const deck = [1, 2, 3, 4, 10];
seeingDouble(deck);
// => [2, 4, 6, 8, 20]

2. ডেকে পাওয়া প্রতিটি ৩-এর একাধিক কপি তৈরি করুন

Elyse ডেকে পাওয়া প্রতিটি ৩-এর তিনটি করে কপি বানাতে চায়। কোনো ডেক যদি একটি মাত্র ৩ দিয়ে শুরু হয়, তবে কৌশলটির পরে মূল ৩টির জায়গায় ডেকটিতে তিনটি ৩ থাকবে।

const deck = [1, 3, 9, 3, 7];
threeOfEachThree(deck);
// => [1, 3, 3, 3, 9, 3, 3, 3, 7]

3. ডেকের একেবারে মধ্যখান থেকে দুটি তাস খুঁজে বের করুন

Elyse দশটি তাসের একটি ডেক নেবে এবং মাঝের দুটি তাস ছাড়া বাকি সব তাস উধাও করে দেবে।

const deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
middleTwo(deck);
// => [5, 6]

4. বাইরের দুটি তাস ডেকের মাঝখানে ফিরে আসবে

Elyse ডেকের একেবারে উপরের ও নিচের তাস দুটি উল্টো ক্রমে মাঝখানে নিয়ে যেতে চায়।

ধরে নিতে পারেন যে ডেকটিতে জোড় সংখ্যক তাস আছে।

const deck = [1, 2, 3, 5, 6, 10];
sandwichTrick(deck);
// => [2, 3, 10, 1, 5, 6]

5. ২ নয় এমন প্রতিটি তাস উধাও হয়ে যায়

Elyse-এর আজকের প্রিয় সংখ্যা ২। এই কৌশলে ডেক থেকে ২ নয় এমন প্রতিটি তাস উধাও হয়ে যাবে।

const deck = [1, 2, 3, 4, 10, 2];
twoIsSpecial(deck);
// => [2, 2]

6. এলোমেলো ডেককে নিখুঁতভাবে সাজানো ডেকে রূপান্তর করুন

Elyse তাসগুলো নিখুঁতভাবে নতুন করে সাজানোর নিজের দক্ষতা দেখাতে চায়, ডেক যত ভালোভাবেই এলোমেলো করা হোক না কেন।

const deck = [10, 1, 5, 3, 2, 8, 7];
perfectlyOrdered(deck);
// => [1, 2, 3, 5, 7, 8, 10]

7. ডেক নতুন করে সাজান

Elyse ডেকের তাসগুলোর ক্রম বদলাতে চায়। কৌশলটির পরে যে তাসটি এখন সবার উপরে আছে, সেটি ডেকের একেবারে নিচে চলে যাবে। দ্বিতীয় তাসটি যাবে শেষের ঠিক আগে, ইত্যাদি।

const deck = [10, 1, 5, 3, 2];
reorder(deck);
// => [2, 3, 5, 1, 10]
GitHub-এর মাধ্যমে সম্পাদনা করুন লিংকটি একটি নতুন উইন্ডো বা ট্যাবে খোলে
JavaScript Exercism

এলিসের রূপান্তরী জাদু শুরু করতে প্রস্তুত?

Exercism-এ সাইন আপ করুন, JavaScript ট্র্যাকের 37টি কনসেপ্ট159টি অনুশীলনী আর সত্যিকারের মানুষের মেন্টরিং দিয়ে শিখুন ও দক্ষ হয়ে উঠুন, সম্পূর্ণ বিনামূল্যে।