ভূমিকা
একই `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` ফাংশন রিযূজেবল।