ভূমিকা
একাধিক অ্যারে (অ্যারে অফ অ্যারে) দেওয়া থাকলে, সব এলিমেন্ট একত্রিত করে শুধু **ইউনিক (unique)** এলিমেন্টগুলো বের করা - অর্থাৎ যেসব এলিমেন্ট শুধু একবারই আসেছে সব অ্যারে মিলিয়ে।
সম্পূর্ণ কোড
const arr = [
[12, 45, 65, 76, 76, 87, 98],
[54, 65, 98, 23, 78, 9, 1, 3],
[87, 98, 3, 2, 123, 877, 22, 5, 23, 67]
];
const getUnique = (arr) => {
const newArray = [];
arr.forEach((el) => newArray.push(...el)); // ফ্ল্যাটেন
return newArray.filter((item, index) => {
return newArray.indexOf(item) === newArray.lastIndexOf(item);
});
};
console.log(getUnique(arr));
// আউটপুট: [12, 45, 54, 78, 9, 1, 2, 123, 877, 22, 5, 67]
কোড ব্যাখ্যা
- ফ্ল্যাটেন: `forEach` + `push(...el)` - সব সাব-অ্যারে একত্রিত
- ফিল্টার: `indexOf === lastIndexOf` - শুধু একবার আসা এলিমেন্ট রেখে
আউটপুট
[12, 45, 54, 78, 9, 1, 2, 123, 877, 22, 5, 67]
⚠️ পারফরম্যান্স সমস্যা
`indexOf`/`lastIndexOf` প্রতিটি এলিমেন্টের জন্য O(n) করে, মোট **O(n²)**। বড় ডেটার জন্য ধীর।
অপ্টিমাইজড সংস্করণ: Map/Set (O(n))
১. ফ্রিকোয়েন্সি Map (সেরা - O(n))
const getUniqueOptimized = (arrays) => {
const freq = new Map();
// ফ্ল্যাটেন + কাউন্ট
for (const subArr of arrays) {
for (const item of subArr) {
freq.set(item, (freq.get(item) || 0) + 1);
}
}
// ফ্রিকোয়েন্সি ১ ফিল্টার
return [...freq.entries()]
.filter(([, count]) => count === 1)
.map(([val]) => val);
};
২. Set + Filter (সংক্ষিপ্ত)
const getUnique = (arrays) => {
const flat = arrays.flat();
const seen = new Set();
const duplicates = new Set();
for (const item of flat) {
if (seen.has(item)) duplicates.add(item);
else seen.add(item);
}
return flat.filter(item => !duplicates.has(item));
};
৩. Reduce + Object (ES5 কম্প্যাটিবল)
const getUnique = (arrays) => {
const flat = [].concat(...arrays);
const freq = flat.reduce((acc, val) => {
acc[val] = (acc[val] || 0) + 1;
return acc;
}, {});
return flat.filter(val => freq[val] === 1);
};
৪. Flat + Filter (ES2019+ - সবচেয়ে ক্লিন)
const getUnique = (arrays) => {
const flat = arrays.flat();
return flat.filter(item => flat.indexOf(item) === flat.lastIndexOf(item));
};
তুলনা
| পদ্ধতি | টাইম | স্পেস | রিডেবিলিটি |
|---|---|---|---|
| indexOf/lastIndexOf | O(n²) | O(n) | উচ্চ |
| Map/Set ফ্রিকোয়েন্সি | O(n) | O(n) | মডার্ন, ফাস্ট |
| Reduce + Object | O(n) | O(n) | ES5 কম্প্যাটিবল |
ব্যবহারিক অ্যাপ্লিকেশন
- ডেটা ডিডুপ্লিকেশন: লগ এন্ট্রি, ইভেন্ট স্টREAM
- সার্ভে АНালাইসিস: ইউনিক রেসপন্স আইডেন্টিফাই
- ইনভেন্টরি: সিঙ্গল-স্টক আইটেম খুঁজে বের করা
সারাংশ
ছোট ডেটার জন্য `flat().filter(indexOf===lastIndexOf)` ঠিক আছে। বড় ডেটা/প্রোডাকশনে **Map/Set ফ্রিকোয়েন্সি কাউন্ট (O(n))** ব্যবহার করুন।