जावास्क्रिप्ट ऑब्जेक्ट में कुंजी के अस्तित्व की जाँच: शुरुआती लोगों के लिए विश्लेषण
\n\nक्या आपने कभी जावास्क्रिप्ट ऑब्जेक्ट से मान प्राप्त करने का प्रयास किया है, और जवाब में रहस्यमय undefined प्राप्त किया है? परिचित स्थिति है, है ना? खासकर जब आप API, कॉन्फ़िगरेशन या बस बड़ी संरचनाओं से डेटा के साथ काम करते हैं। आज हम एक बार और हमेशा के लिए समझ जाएंगे कि ऑब्जेक्ट में कुंजी मौजूद है या नहीं, इसकी सही जाँच कैसे करें। Stack Overflow पर यह सबसे लोकप्रिय प्रश्नों में से एक है - और यह अकारण नहीं है।
कल्पना करें कि ऑब्जेक्ट दराज वाली एक अलमारी है। आप जानना चाहते हैं कि क्या इसमें "चाबियाँ" लिखा हुआ कोई दराज है। आप बस हैंडल खींच सकते हैं (और यदि दराज नहीं है तो त्रुटि प्राप्त कर सकते हैं), या पहले देख सकते हैं और सुनिश्चित कर सकते हैं। जावास्क्रिप्ट में हमारे पास ऐसा करने के तीन विश्वसनीय तरीके हैं। चलिए शुरू करते हैं!
\n\nकुंजी की उपस्थिति की जाँच क्यों करें?
\n\nमान लीजिए कि आप खरीदारी सूची के लिए एक एप्लिकेशन लिख रहे हैं। आपके पास एक cart ऑब्जेक्ट है, जिसमें मात्रा के साथ आइटम हो सकते हैं:
const cart = {\n apples: 3,\n bananas: 5\n};\n\n// हम नाशपाती जोड़ना चाहते हैं, लेकिन नहीं जानते कि वे पहले से मौजूद हैं या नहीं\nfunction addItem(item, quantity) {\n if (cart[item] !== undefined) {\n cart[item] += quantity;\n } else {\n cart[item] = quantity;\n }\n}\n\nयह कोड काम करेगा, लेकिन इसमें कमियाँ हैं। क्या होगा यदि कुंजी का मान 0 या null है? तब undefined की जाँच गलत परिणाम देगी। इसलिए आइए पेशेवर दृष्टिकोणों को समझें।
विधि 1: in ऑपरेटर - सार्वभौमिक सैनिक
\n\nin ऑपरेटर जाँचता है कि ऑब्जेक्ट में कोई प्रॉपर्टी मौजूद है या नहीं, जिसमें विरासत में मिली प्रॉपर्टी शामिल हैं। यह सबसे विश्वसनीय तरीका है जब आपको यह जानना हो कि कुंजी बिल्कुल मौजूद है या नहीं।
const user = {\n name: 'अन्ना',\n age: 25,\n isAdmin: false\n};\n\nconsole.log('name' in user); // true\nconsole.log('age' in user); // true\nconsole.log('salary' in user); // false\nconsole.log('toString' in user); // true (Object से विरासत में मिला)\n\nलाभ: तब भी काम करता है जब मान null, undefined या false हो। प्रोटोटाइप श्रृंखला की जाँच करता है।
नुकसान: यह विरासत में मिली प्रॉपर्टी ढूंढ सकता है जिनकी आपको आवश्यकता नहीं है। उदाहरण के लिए, toString या hasOwnProperty।
अधिकांश मामलों के लिए, in एक आदर्श विकल्प है। खासकर जब आप सामान्य शब्दकोश-शैली ऑब्जेक्ट के साथ काम कर रहे हों।
विधि 2: hasOwnProperty() - केवल अपनी कुंजियाँ
\n\nयदि आपको केवल ऑब्जेक्ट की अपनी प्रॉपर्टी (विरासत में मिली नहीं) की जाँच करनी है, तो hasOwnProperty विधि का उपयोग करें। यह जावास्क्रिप्ट में सभी ऑब्जेक्ट की एक मानक विधि है।
const book = {\n title: 'डमीज़ के लिए जावास्क्रिप्ट',\n pages: 300\n};\n\nconsole.log(book.hasOwnProperty('title')); // true\nconsole.log(book.hasOwnProperty('pages')); // true\nconsole.log(book.hasOwnProperty('toString')); // false (अपनी प्रॉपर्टी नहीं)\nconsole.log(book.hasOwnProperty('author')); // false\n\nध्यान दें: hasOwnProperty विरासत में मिली प्रॉपर्टी की जाँच नहीं करता है। यह इसे अपरिहार्य बनाता है जब आप क्लास या प्रोटोटाइप के साथ ऑब्जेक्ट बनाते हैं।
लेकिन एक बारीक बात है! यदि आपका ऑब्जेक्ट Object.create(null) के साथ बनाया गया है, तो उसके पास hasOwnProperty विधि नहीं होगी। क्या करें? सुरक्षित कॉल का उपयोग करें:
const dict = Object.create(null);\ndict.key1 = 'value1';\n\n// यह काम नहीं करेगा:\n// console.log(dict.hasOwnProperty('key1')); // TypeError\n\n// लेकिन यह करेगा:\nconsole.log(Object.prototype.hasOwnProperty.call(dict, 'key1')); // true\n\nआधुनिक सिंटैक्स Object.hasOwn() का उपयोग करने की अनुमति देता है - ES2022 में जोड़ी गई एक स्थिर विधि। यह इस समस्या को सुरुचिपूर्ण ढंग से हल करती है:
console.log(Object.hasOwn(dict, 'key1')); // true\n\nमैं Obj का उपयोग करने की सलाह देता हूँ