जावास्क्रिप्ट में ऑब्जेक्ट की लंबाई: कोई सरल .length क्यों नहीं है और क्या करें?
\n\nक्या आपने कभी सोचा है: "अरे, ऐरे में .length प्रॉपर्टी क्यों होती है, लेकिन ऑब्जेक्ट में नहीं?" अगर हाँ — तो आप अकेले नहीं हैं। प्रश्न "Length of a JavaScript object" Stack Overflow पर हजारों व्यूज़ के साथ सबसे लोकप्रिय प्रश्नों में से एक है। और यह आश्चर्यजनक नहीं है: हर शुरुआती देर-सबेर obj.length लिखने की कोशिश करता है और undefined प्राप्त करता है।
इस लेख में, हम समझेंगे कि ऐसा क्यों होता है, और सबसे महत्वपूर्ण बात — जावास्क्रिप्ट में ऑब्जेक्ट की लंबाई सही तरीके से कैसे गिनें। आप 4 कार्यशील तरीके सीखेंगे, समझेंगे कि कब किसका उपयोग करना है, और हमेशा के लिए ऑब्जेक्ट की लंबाई के भ्रम को भूल जाएंगे।
\n\nऑब्जेक्ट में length प्रॉपर्टी क्यों नहीं होती?
\n\nइसका कारण ऑब्जेक्ट की प्रकृति है। ऐरे संख्यात्मक इंडेक्स वाला एक क्रमबद्ध संग्रह है। जावास्क्रिप्ट इंजन आसानी से कह सकता है: "ऐरे में 5 तत्व हैं।" जबकि ऑब्जेक्ट "कुंजी-मान" जोड़ियों का एक अक्रमबद्ध सेट है। सैद्धांतिक रूप से, आप एक प्रॉपर्टी जोड़ सकते हैं, हटा सकते हैं, फिर से जोड़ सकते हैं — और क्रम की गारंटी नहीं है (कम से कम पुराने स्पेसिफिकेशन में)।
\n\nयही कारण है कि सरल ऑब्जेक्ट में बिल्ट-इन .length नहीं होता। लेकिन इसका मतलब यह नहीं है कि हम इसकी गणना नहीं कर सकते। आइए देखें कैसे।
तरीका #1: Object.keys() — स्वर्ण मानक
\n\nसबसे लोकप्रिय और अनुशंसित तरीका Object.keys() का उपयोग करना है। यह विधि ऑब्जेक्ट की अपनी (विरासत में न मिली) गणनीय प्रॉपर्टीज़ की एक ऐरे लौटाती है। और ऐरे में, जैसा कि हम जानते हैं, .length होता है।
const user = {\n name: 'अन्ना',\n age: 28,\n city: 'मॉस्को',\n isAdmin: false\n};\n\nconst length = Object.keys(user).length;\nconsole.log(length); // 4\n\nयह बहुत सरल है! आप कुंजियों की एक ऐरे प्राप्त करते हैं, और फिर इसकी लंबाई लेते हैं। यह तरीका सभी आधुनिक ब्राउज़रों और Node.js में काम करता है।
\n\nObject.keys() में क्या शामिल है?
\n\nमहत्वपूर्ण बिंदु: Object.keys() केवल अपनी और गणनीय प्रॉपर्टीज़ लौटाता है। इसका मतलब है कि:
- \n
- अपनी — प्रोटोटाइप के माध्यम से विरासत में न मिली। यदि आपने क्लास के माध्यम से ऑब्जेक्ट बनाया या प्रोटोटाइप में एक विधि जोड़ी, तो वह परिणाम में शामिल नहीं होगी। \n
- गणनीय — वे जिनका फ़्लैग
enumerabletrueपर सेट है। डिफ़ॉल्ट रूप से, असाइनमेंट के माध्यम से बनाई गई सभी प्रॉपर्टीज़ गणनीय होती हैं। लेकिन यदि आपनेObject.defineProperty()का उपयोगenumerable: falseके साथ किया है, तो ऐसी प्रॉपर्टी को अनदेखा कर दिया जाएगा। \n
गैर-गणनीय प्रॉपर्टी का उदाहरण:
\n\nconst car = {\n brand: 'Toyota',\n model: 'Camry'\n};\n\nObject.defineProperty(car, 'vin', {\n value: 'JT2BF22KX00000001',\n enumerable: false\n});\n\nconsole.log(Object.keys(car).length); // 2 (vin शामिल नहीं है)\n\nतरीका #2: Object.values() और Object.entries()
\n\nकभी-कभी आपको केवल कुंजियों की संख्या नहीं, बल्कि मानों या जोड़ियों की संख्या चाहिए। यहाँ आपकी मदद करेंगे दो जुड़वाँ भाई:
\n\n- \n
Object.values(obj)— मानों की एक ऐरे लौटाता है \n Object.entries(obj)— [कुंजी, मान] की एक ऐरे लौटाता है \n
दोनों ऐरे लौटाते हैं, और इसलिए उनके पास .length है:
const book = {\n title: 'मास्टर और मार्गरीटा',\n author: 'बुल्गाकोव',\n year: 1966\n};\n\nconsole.log(Object.values(book).length); // 3\nconsole.log(Object.entries(book).length); // 3\n\nमूलतः, यह समान संख्या है, लेकिन Object.entries() अधिक डेटा देता है यदि आगे आपको कुंजियों और मानों दोनों की आवश्यकता हो।
तरीका #3: for...in लूप (और जाल में कैसे न फँसें)
\n\nक्लासिक, लेकिन कम सुविधाजनक तरीका — for...in लूप का उपयोग करना और मैन्युअल रूप से प्रॉपर्टीज़ गिनना:
const person = {\n name: 'इवान',\n age: 30\n};\n\nlet count = 0;\nfor (let key in