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

জাভাস্ক্রিপ্টে অবজেক্ট অ্যারে গ্রুপ বাই মাল্টিপল প্রপার্টি (এফিশিয়েন্ট)


সমস্যা বিবরণ

ফেজ, স্টেপ, টাস্ক, ভ্যালু সহ অবজেক্ট অ্যারে দেওয়া আছে। এক বা একাধিক প্রপার্টি (ফেজ, স্টেপ) অনুযায়ী গ্রুপ করে ভ্যালুর সমষ্টি বের করতে হবে।

সমাধান

const arr = [
  { Phase: "Phase 1", Step: "Step 1", Task: "Task 1", Value: "5" },
  { Phase: "Phase 1", Step: "Step 1", Task: "Task 2", Value: "10" },
  { Phase: "Phase 1", Step: "Step 2", Task: "Task 1", Value: "15" },
  { Phase: "Phase 1", Step: "Step 2", Task: "Task 2", Value: "20" },
  { Phase: "Phase 2", Step: "Step 1", Task: "Task 1", Value: "25" },
  { Phase: "Phase 2", Step: "Step 1", Task: "Task 2", Value: "30" },
  { Phase: "Phase 2", Step: "Step 2", Task: "Task 1", Value: "35" },
  { Phase: "Phase 2", Step: "Step 2", Task: "Task 2", Value: "40" }
];

const groupBy = (array, groups, valueKey) => {
  const map = new Map;
  groups = [].concat(groups);
  return array.reduce((acc, val) => {
    groups.reduce((accu, value, ind, { length }) => {
      let child;
      if (accu.has(val[value])) {
        return accu.get(val[value]);
      }
      if (ind + 1 === length) {
        child = Object.assign(...groups.map(value => ({ [value]: val[value] })), { [valueKey]: 0 });
        acc.push(child);
      } else {
        child = new Map;
      }
      accu.set(val[value], child);
      return child;
    }, map)[valueKey] += +val[valueKey];
    return acc;
  }, []);
};

console.log(groupBy(arr, 'Phase', 'Value'));
console.log(groupBy(arr, ['Phase', 'Step'], 'Value'));

আউটপুট

[ { Phase: 'Phase 1', Value: 50 }, { Phase: 'Phase 2', Value: 130 } ]
[ { Phase: 'Phase 1', Step: 'Step 1', Value: 15 }, { Phase: 'Phase 1', Step: 'Step 2', Value: 35 }, { Phase: 'Phase 2', Step: 'Step 1', Value: 55 }, { Phase: 'Phase 2', Step: 'Step 2', Value: 75 } ]

অ্যালগরিদম ব্যাখ্যা

  • Map ব্যবহার করে নেস্টেড গ্রুপিং হায়ারার্কি তৈরি করা হয়েছে।
  • লাস্ট লেভেলে রেজাল্ট অবজেক্ট তৈরি করে valueKey সমষ্টি করা হয়েছে।
  • এই পদ্ধতি O(n) টাইম কমপ্লেক্সিটিতে কাজ করে।
  1. জাভাস্ক্রিপ্টে Array.prototype.includes() মেথড

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

  3. জাভাস্ক্রিপ্টে অ্যারেতে অবজেক্টগুলির মধ্যজাত একটি মেথড শেয়ার করা যায় কি?

  4. জাভাস্ক্রিপ্ট অবজেক্টের অ্যারেতে অ্যারে মেথডগুলো ব্যবহার করা