JavaScript-এ `hasOwnProperty()` ব্যবহার করে সোর্ড অবজেক্টের প্রপার্টি টার্গেট অবজেক্টে কপি করা যায়, শর্ত থাকে টার্গেটে সেটি আগে থেকে নেই। এটি ডিফল্ট কনফিগারেশন মার্জের জন্য আদর্শ।
কোড উদাহরণ
var first = { key1: 100, key2: 40, key3: 70 };
var second = { key2: 80, key3: 70, key4: 1000 };
function mergeWithoutOverwrite(target, source) {
for (let key in source) {
// source-এ নিজস্ব প্রপার্টি আছে কিনা এবং target-এ নেই কিনা
if (source.hasOwnProperty(key) && !target.hasOwnProperty(key)) {
target[key] = source[key];
}
}
return target;
}
console.log(mergeWithoutOverwrite(first, second));
// { key1: 100, key2: 40, key3: 70, key4: 1000 }
চলানোর পদ্ধতি
- কোডটি
mergeNoOverwrite.jsনামে সংরক্ষণ করুন। - টার্মিনালে চালান:
node mergeNoOverwrite.js
আউটপুট
{ key1: 100, key2: 40, key3: 70, key4: 1000 }
ব্যাখ্যা
- `key2` ও `key3` first-এ থাকায় কপি হয়নি (ওভাররাইট নেই)।
- `key4` first-এ নাই, তাই কপি হয়েছে।
- `hasOwnProperty` প্রোটোটাইপ চেইন থেকে ইনহেরিটেড প্রপার্টি বাদ দেয়।
আধুনিক পদ্ধতি: Object.assign + ফিল্টার
const mergeNoOverwrite = (target, source) => {
const newKeys = Object.keys(source).filter(k => !target.hasOwnProperty(k));
const additions = Object.fromEntries(newKeys.map(k => [k, source[k]]));
return { ...target, ...additions };
};
ES2021: Object.hasOwn() (সেরা পদ্ধতি)
if (Object.hasOwn(source, key) && !Object.hasOwn(target, key)) {
target[key] = source[key];
}
// hasOwn() hasOwnProperty()-এর চেয়ে সেফ (null-প্রোটোটাইপ অবজেক্টেও কাজ করে)
ডিপ মার্জ (Nested Objects)
নেস্টেড অবজেক্টের জন্য রিকারসিভ ফাংশন বা Lodash `_.defaultsDeep()` ব্যবহার করুন।
ব্যবহার ক্ষেত্র
- ডিফল্ট কনফিগারেশন + ইউজার কনফিগারেশন মার্জ
- ফর্ম ডেটা + ডিফল্ট ভ্যালু
- থিম অপশন মার্জ (বেস থিম + কাস্টম থিম)