একটি অবজেক্টের ডিপ কপি মানে সে অবজেক্টের ভিতরে এনকাউন্টার হওয়া প্রতিটি অবজেক্ট ডুপ্লিকেট করা। কপি এবং অরিজিনাল অবজেক্ট কিছুই শেয়ার করবে না, তাই এটি অরিজিনালের একটি ট্রু কপি হবে।
সবচেয়ে সহজ পদ্ধতি: অবজেক্টকে JSON স্ট্রিংএ কনভার্ট করে আবার JS অবজেক্টে পาร์্স করা। তবে এই পদ্ধতিতে মেথড কপি হয় না।
উদাহরণ: JSON.parse/stringify
let obj = {
foo: 1,
bar: { baz: 'test' }
};
let newObj = JSON.parse(JSON.stringify(obj));
obj.bar.baz = 20;
console.log(obj); // { foo: 1, bar: { baz: 20 } }
console.log(newObj); // { foo: 1, bar: { baz: 'test' } }
আউটপুট
{ foo: 1, bar: { baz: 20 } } { foo: 1, bar: { baz: 'test' } }
newObj অরিজিনাল obj-এর আপডেটের সাথে পরিবর্তিত হয়নি, তাই ডিপ কপি সফল হয়েছে।
লিমিটেশন
- ফাংশন/মেথড কপি হয় না
Date,RegExp,Map,Setইত্যাদি স্পেশাল অবজেক্ট হ্যান্ডেল করে না- সার্কুলার রেফারেন্স হলে এরর দেয়
undefined,Symbolস্কিপ হয়
বিকল্প পদ্ধতি
- Lodash:
_.cloneDeep(obj)(সব টাইপ হ্যান্ডেল করে) - structuredClone(): মডার্ন ব্রাউজার API (সার্কুলার রেফারেন্স সাপোর্ট করে)
- Custom রিকার্সিভ ফাংশন: 스페সিফিক नीডের জন্য
structuredClone উদাহরণ
const original = { a: 1, b: { c: 2 }, date: new Date() };
const cloned = structuredClone(original);
cloned.b.c = 99;
console.log(original.b.c); // 2 (অপরিবর্তিত)