"प्रॉपर्टी गायब, ऑब्जेक्ट बचा": JavaScript में अनावश्यक को कैसे हटाएं?
\n\nएक स्थिति की कल्पना करें: आप एक बड़े ऑब्जेक्ट के साथ काम कर रहे हैं जो सर्वर से आया है। इसमें 20 फील्ड हैं, लेकिन फॉर्म भेजने के लिए केवल 15 चाहिए। या आप एक फंक्शन लिख रहे हैं जिसे बिना सर्विस फील्ड _id के डेटा वापस करना है। क्या करें? Stack Overflow पर इस विषय पर सबसे लोकप्रिय सवाल को सैकड़ों हजारों बार देखा गया है - और यह कोई संयोग नहीं है।
किसी ऑब्जेक्ट से प्रॉपर्टी हटाना एक ऐसा काम है जो सामान्य लगता है, लेकिन इसमें कई आश्चर्य छिपे हैं। इस लेख में हम JavaScript ऑब्जेक्ट से प्रॉपर्टी हटाने के सभी मुख्य तरीकों पर चर्चा करेंगे, उनकी परफॉरमेंस और म्यूटेबिलिटी की तुलना करेंगे, और पता लगाएंगे कि 2025 में कौन सा तरीका चुनना चाहिए।
\n\nतरीका #1: delete ऑपरेटर - क्लासिक तरीका
\n\nसबसे स्पष्ट और ऐतिहासिक रूप से पहला तरीका delete ऑपरेटर का उपयोग करना है। यह ऑब्जेक्ट से प्रॉपर्टी को पूरी तरह और स्थायी रूप से हटा देता है।
const user = {\n name: 'अन्ना',\n email: 'anna@example.com',\n password: 'super_secret_123'\n};\n\ndelete user.password;\n\nconsole.log(user);\n// { name: 'अन्ना', email: 'anna@example.com' }\nconsole.log(user.password); // undefined\n\n\ndelete वास्तव में कैसे काम करता है?
\n\ndelete ऑपरेटर केवल undefined असाइन नहीं करता। यह प्रॉपर्टी को ऑब्जेक्ट से पूरी तरह हटा देता है। आप इसे hasOwnProperty मेथड से जांच सकते हैं:
const car = { brand: 'Tesla' };\nconsole.log(car.hasOwnProperty('brand')); // true\n\ndelete car.brand;\nconsole.log(car.hasOwnProperty('brand')); // false\n\n\nमहत्वपूर्ण अंतर: delete के बाद प्रॉपर्टी का अस्तित्व समाप्त हो जाता है। for...in या Object.keys() के माध्यम से इटरेशन करने पर यह दिखाई नहीं देगी।
delete कब काम नहीं करेगा?
\n\nकुछ "सावधानियां" हैं:
\n\n- \n
- var/let/const के माध्यम से घोषित प्रॉपर्टी को हटाया नहीं जा सकता।
deleteऑपरेटर केवल ऑब्जेक्ट की प्रॉपर्टी के साथ काम करता है। \n - प्रोटोटाइप से विरासत में मिली प्रॉपर्टी नहीं हटती - केवल अपनी प्रॉपर्टी हटती है। \n
- configurable: false फ्लैग वाली प्रॉपर्टी (जैसे बिल्ट-इन ऑब्जेक्ट में) नहीं हटती। स्ट्रिक्ट मोड में यह एरर देगी। \n
// उदाहरण: configurable: false वाली प्रॉपर्टी\nconst obj = {};\nObject.defineProperty(obj, 'fixed', {\n value: 42,\n configurable: false\n});\n\ndelete obj.fixed; // false (नहीं हटी)\nconsole.log(obj.fixed); // 42\n\n\nतरीका #2: डिस्ट्रक्चरिंग और रेस्ट ऑपरेटर - आधुनिक तरीका
\n\nयदि आप इम्यूटेबल डेटा के साथ काम कर रहे हैं (और आधुनिक JavaScript में इसे अच्छा अभ्यास माना जाता है), तो delete सबसे अच्छा विकल्प नहीं हो सकता - यह मूल ऑब्जेक्ट को म्यूटेट करता है। विकल्प है - डिस्ट्रक्चरिंग का उपयोग करके बिना अनावश्यक प्रॉपर्टी के एक नया ऑब्जेक्ट बनाना:
const user = {\n name: 'इवान',\n email: 'ivan@example.com',\n role: 'admin',\n token: 'abc123'\n};\n\n// token फील्ड हटाकर नया ऑब्जेक्ट बनाएं\nconst { token, ...userWithoutToken } = user;\n\nconsole.log(userWithoutToken);\n// { name: 'इवान', email: 'ivan@example.com', role: 'admin' }\nconsole.log(user.token); // 'abc123' - मूल ऑब्जेक्ट अछूता!\n\n\nयह तरीका React डेवलपमेंट में विशेष रूप से लोकप्रिय है, जब कंपोनेंट को केवल कुछ प्रॉप्स भेजने होते हैं और सर्विस फील्ड को छोड़ना होता है।
\n\nडिस्ट्रक्चरिंग के फायदे और नुकसान
\n\n- \n
- + इम्यूटेबिलिटी: मूल ऑब्जेक्ट अपरिवर्तित रहता है। यह Redux, Vuex और फंक्शनल प्रोग्रामिंग के लिए महत्वपूर्ण है। \n
- + पठनीयता: स्पष्ट रूप से दिखता है कि कौन से फील्ड को हटा रहे हैं। \n
- - परफॉरमेंस: ऑब्जेक्ट की कॉपी बनती है, जो बड़े ऑब्जेक्ट के लिए महंगी हो सकती है। \n
- - कई प्रॉपर्टी हटाने में असुविधाजनक: यदि 20 में से 5 फील्ड हटाने हैं,