কম্পিউটার টিউটোরিয়াল

JavaScript-এ reduce() ব্যবহার করে অবজেক্ট অ্যারে মার্জ করা (hobby ফিল্ড মெர্জ)

ভূমিকা

একই `id` वाले একাধিক অবজেক্ট থাকলে, সেগুলোকে একট্র করতে এবং `hobby` ফিল্ডকে অ্যারে হিসেবে একত্রিত করার পদ্ধতি। `Array.prototype.reduce()` ব্যবহার করে এক পাসে সমাধান।

ইনপুট ডেটা

const arr = [
  { id: 121, hobby: 'cycling' },
  { id: 125, hobby: 'jogging' },
  { id: 129, hobby: 'reading' },
  { id: 121, hobby: 'writing' },
  { id: 121, hobby: 'playing football' },
  { id: 125, hobby: 'cooking' },
  { id: 129, hobby: 'horse riding' }
];

সম্পূর্ণ কোড

const mergeArray = (arr) => {
  return arr.reduce((acc, val) => {
    const ind = acc.findIndex(item => item.id === val.id);
    if (ind !== -1) {
      acc[ind].hobby.push(val.hobby);
    } else {
      acc.push({ id: val.id, hobby: [val.hobby] });
    }
    return acc;
  }, []);
};

console.log(mergeArray(arr));

আউটপুট

[
  { id: 121, hobby: ['cycling', 'writing', 'playing football'] },
  { id: 125, hobby: ['jogging', 'cooking'] },
  { id: 129, hobby: ['reading', 'horse riding'] }
]

কোড ব্যাখ্যা

  • অ্যাকুমুলেটর (acc): ফলাফল অ্যারে, প্রাথমিক খালি `[]`
  • findIndex: বর্তমান `id` আগে থেকেই আছে কিনা চেক
  • মিললে: `hobby` অ্যারেতে পুশ
  • না মিললে: নতুন অবজেক্ট `{id, hobby: [val.hobby]}` পুশ

⚠️ পারফরম্যান্স নোট

`findIndex` প্রতিটি ইটারেশনে O(n) করে, মোট O(n²)। বড় অ্যারে হলে স্লো হবে।

অপ্টিমাইজড সংস্করণ: Map/Object ব্যবহার (O(n))

const mergeArrayOptimized = (arr) => {
  const map = new Map();
  
  for (const item of arr) {
    if (map.has(item.id)) {
      map.get(item.id).hobby.push(item.hobby);
    } else {
      map.set(item.id, { id: item.id, hobby: [item.hobby] });
    }
  }
  
  return [...map.values()];
};

অথবা Object ব্যবহার (লিগ্যাসি সাপোর্ট)

const mergeArrayObj = (arr) => {
  const map = {};
  for (const item of arr) {
    if (map[item.id]) {
      map[item.id].hobby.push(item.hobby);
    } else {
      map[item.id] = { id: item.id, hobby: [item.hobby] };
    }
  }
  return Object.values(map);
};

Reduce + Map হাইব্রিড (ফাংশনাল + ফাস্ট)

const mergeArrayFast = (arr) => 
  [...arr.reduce((map, item) => {
    const existing = map.get(item.id);
    if (existing) existing.hobby.push(item.hobby);
    else map.set(item.id, { id: item.id, hobby: [item.hobby] });
    return map;
  }, new Map()).values()];

তুলনামূলক পারফরম্যান্স

পদ্ধতি টাইম কমপ্লেক্সিটি নোট
reduce + findIndex O(n²) সিম্পল, ছোট ডেটার জন্য OK
Map/Object + Loop O(n) প্রস্তাবিত, বড় ডেটার জন্য
Reduce + Map O(n) ফাংশনাল স্টাইল, ফাস্ট

জেনারেলাইজড ভার্সন (যেকোনো ফিল্ডে গ্রুপ)

const groupBy = (arr, key, mergeField) => 
  [...arr.reduce((map, item) => {
    const k = item[key];
    if (map.has(k)) {
      map.get(k)[mergeField].push(item[mergeField]);
    } else {
      map.set(k, { ...item, [mergeField]: [item[mergeField]] });
    }
    return map;
  }, new Map()).values()];

// ব্যবহার
console.log(groupBy(arr, 'id', 'hobby'));

সারাংশ

ছোট ডেটার জন্য `reduce` + `findIndex` ঠিক আছে। বড় ডেটা/প্রোডাকশনে **Map/Object-ভিত্তিক O(n) পদ্ধতি** ব্যবহার করুন। জেনারেলাইজড `groupBy` ফাংশন রিযূজেবল।

  1. জাভাস্ক্রিপ্টে অ্যারে থেকে সেটে কনভার্ট করা

  2. জাভাস্ক্রিপ্টে অ্যারে রিডিউস করা (reduce)

  3. জাভাস্ক্রিপ্টে অবজেক্টের অ্যারে ID দিয়ে গ্রুপ করা

  4. জাভাস্ক্রিপ্টে বাটন ক্লিকে অ্যারে আইটেমগুলো রিভার্স ক্রমে একটা করে দেখানো