ভূমিকা
অবজেক্টের অ্যারে থেকে ডুপ্লিকেট এন্ট্রি সরাতে হলে সাধারণ filter বা Set কাজ করে না, কারণ অবজেক্ট রেফারেন্স দিয়ে কমপেয়ার হয়। এই আর্টিকেলে JSON.stringify এবং Map ব্যবহার করে ডুপ্লিকেট মুছে ফেলার পদ্ধতি দেখানো হয়েছে।
সম্পূর্ণ কোড
const arr = [
{ "timestamp": 564328370007, "message": "It will rain today" },
{ "timestamp": 164328302520, "message": "will it rain today" },
{ "timestamp": 564328370007, "message": "It will rain today" },
{ "timestamp": 564328370007, "message": "It will rain today" }
];
const map = {};
const newArray = [];
arr.forEach(el => {
const key = JSON.stringify(el);
if (!map[key]) {
map[key] = true;
newArray.push(el);
}
});
console.log(newArray);
কোড ব্যাখ্যা
- Map অবজেক্ট:
mapঅবজেক্টটি যাচাই করা কীগুলো ট্র্যাক রাখে - JSON.stringify: প্রতিটি অবজেক্টকে স্ট্রিংয়ে রূপান্তর করে যাতে এটি কী হিসেবে ব্যবহার করা যায়
- চেক: যদি কী Map-এ না থাকে, তবে যোগ করুন এবং রেজাল্ট অ্যারেতে পুশ করুন
- ফলাফল: শুধু ইউনিক অবজেক্টগুলো থাকে
আউটপুট
[
{ timestamp: 564328370007, message: 'It will rain today' },
{ timestamp: 164328302520, message: 'will it rain today' }
]
উন্নত ও আধুনিক পদ্ধতিগুলো
১. Set + JSON.stringify (সংক্ষিপ্ত)
const unique = [...new Set(arr.map(JSON.stringify))].map(JSON.parse);
// অথবা
const unique = arr.filter((item, index, self) =>
index === self.findIndex(t => JSON.stringify(t) === JSON.stringify(item))
);
২. Map অবজেক্ট ব্যবহার (ES6+, বেটার পারফরম্যান্স)
const uniqueMap = new Map();
arr.forEach(item => {
const key = JSON.stringify(item);
if (!uniqueMap.has(key)) {
uniqueMap.set(key, item);
}
});
const result = [...uniqueMap.values()];
৩. লোডাশ (Lodash) ব্যবহার
// _.uniqWith(arr, _.isEqual) - গভীর তুলনা করে
গভীর তুলনা (Deep Comparison) সমস্যা
JSON.stringify-র সীমাবদ্ধতা:
- প্রপার্টি অর্ডার মেটার করে:
{a:1, b:2}!=={b:2, a:1} undefined,function,Symbolস্ট্রিংফাইতে হারায়- সার্কুলার রেফারেন্স হলে এরর
রোবাস্ট সমাধান (Deep Equal)
function deepEqual(a, b) {
if (a === b) return true;
if (a == null || b == null) return false;
if (typeof a !== 'object' || typeof b !== 'object') return false;
const keysA = Object.keys(a);
const keysB = Object.keys(b);
if (keysA.length !== keysB.length) return false;
return keysA.every(key => deepEqual(a[key], b[key]));
}
const uniqueDeep = arr.filter((item, index, self) =>
index === self.findIndex(t => deepEqual(t, item))
);
পারফরম্যান্স টিপস
- বড় অ্যারে হলে
MapবাSetব্যবহার করুন (O(n)) - সিম্পল অবজেক্ট হলে
JSON.stringifyবাড়তি 괜찮아요 - ইডেন্টিটি বাই রেফারেন্স চাইলে
Setসরাসরি কাজ করবে
সারাংশ
অবজেক্টের অ্যারে থেকে ডুপ্লিকেট সরানোর জন্য Map + JSON.stringify সবচেয়ে কার্যকর এবং ব্যাপকভাবে ব্যবহৃত পদ্ধতি। জটিল অবজেক্টের জন্য কাস্টম deepEqual ফাংশন ব্যবহার করুন।