मानक ऑब्जेक्ट कार्यान्वयन ( ES5.1 ऑब्जेक्ट इंटरनल प्रॉपर्टीज़ एंड मेथड्स ) Object
को अपनी कुंजियों / गुणों की संख्या को ट्रैक करने की आवश्यकता नहीं होती है , इसलिए Object
स्पष्ट रूप से या इसकी कुंजियों पर ध्यान दिए बिना आकार का निर्धारण करने के लिए कोई मानक तरीका नहीं होना चाहिए ।
इसलिए यहां सबसे अधिक उपयोग किए जाने वाले विकल्प हैं:
1. ECMAScript के ऑब्जेक्ट.की ()
Object.keys(obj).length;
अस्थायी सरणी की गणना करने और उसकी लंबाई वापस करने के लिए आंतरिक रूप से कुंजियों पर चलने से काम करता है ।
- पेशेवरों - पठनीय और स्वच्छ वाक्यविन्यास। यदि मूल समर्थन अनुपलब्ध है तो एक पुस्तकालय को छोड़कर किसी भी पुस्तकालय या कस्टम कोड की आवश्यकता नहीं है
- विपक्ष - सरणी के निर्माण के कारण मेमोरी ओवरहेड।
2. पुस्तकालय आधारित समाधान
इस विषय में कहीं और पुस्तकालय आधारित कई उदाहरण उनके पुस्तकालय के संदर्भ में उपयोगी मुहावरे हैं। एक प्रदर्शन के दृष्टिकोण से, हालांकि, एक पूर्ण नहीं-पुस्तकालय कोड की तुलना में कुछ भी हासिल नहीं करना है क्योंकि उन सभी पुस्तकालय विधियों वास्तव में या तो एक लूप Object.keys
या ईएस 5 (देशी या शर्मिंदा) के लिए एनकैप्सुलेट करते हैं।
3. फॉर-लूप का अनुकूलन
इस तरह के एक लूप का सबसे धीमा हिस्सा आमतौर पर .hasOwnProperty()
कॉल है, क्योंकि फ़ंक्शन कॉल ओवरहेड है। इसलिए जब मैं सिर्फ एक JSON ऑब्जेक्ट की प्रविष्टियों की संख्या चाहता हूं, तो मैं बस .hasOwnProperty()
कॉल को छोड़ देता हूं अगर मुझे पता है कि कोई कोड नहीं था और न ही विस्तारित होगा Object.prototype
।
अन्यथा, आपका कोड k
स्थानीय ( var k
) और उपसर्ग-वृद्धि संचालक ( ++count
) का उपयोग करके उपसर्ग के बजाय थोड़ा बहुत अनुकूलित किया जा सकता है ।
var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;
एक अन्य विचार hasOwnProperty
विधि के कैशिंग पर निर्भर करता है :
var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;
दिए गए परिवेश में यह तेज है या नहीं, बेंचमार्किंग का सवाल है। वैसे भी बहुत सीमित प्रदर्शन की उम्मीद की जा सकती है।