সমস্যা বিবরণ
ফেজ, স্টেপ, টাস্ক, ভ্যালু সহ অবজেক্ট অ্যারে দেওয়া আছে। এক বা একাধিক প্রপার্টি (ফেজ, স্টেপ) অনুযায়ী গ্রুপ করে ভ্যালুর সমষ্টি বের করতে হবে।
সমাধান
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) টাইম কমপ্লেক্সিটিতে কাজ করে।