एक जावास्क्रिप्ट वस्तु में तत्वों की संख्या


103

वहाँ एक जावास्क्रिप्ट वस्तु में तत्वों की संख्या (कहीं से) प्राप्त करने का एक तरीका है ?? (अर्थात निरंतर समय जटिलता)।

मैं एक संपत्ति या विधि नहीं खोज सकता जो उस जानकारी को पुनः प्राप्त करे। अब तक मैं केवल पूरे संग्रह के माध्यम से एक पुनरावृत्ति करने के बारे में सोच सकता हूं, लेकिन यह रैखिक समय है।
यह अजीब है कि वस्तु के आकार तक कोई सीधी पहुंच नहीं है, न ही आप सोचते हैं।

संपादित करें:
मैं Objectऑब्जेक्ट के बारे में बात कर रहा हूं (सामान्य रूप से ऑब्जेक्ट नहीं):

var obj = new Object ;

5
पहले से ही यहां उत्तर stackoverflow.com/questions/126100/... Object.keys (obj) .length
झगड़े

जवाबों:


155

हालाँकि JS कार्यान्वयन आंतरिक रूप से ऐसे मूल्य का ट्रैक रख सकता है, लेकिन इसे प्राप्त करने का कोई मानक तरीका नहीं है।

अतीत में, मोज़िला के जावास्क्रिप्ट वेरिएंट ने गैर-मानक को__count__ उजागर किया , लेकिन इसे 1.8.5 संस्करण के साथ हटा दिया गया है।

क्रॉस-ब्राउज़र स्क्रिप्टिंग के लिए आप संपत्तियों और जाँच पर स्पष्ट रूप से ध्यान देने के साथ फंस गए हैं hasOwnProperty():

function countProperties(obj) {
    var count = 0;

    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            ++count;
    }

    return count;
}

ECMAScript 5 सक्षम कार्यान्वयन के मामले में, इसे (कुडोस टू एवी फ्लैक्स ) के रूप में भी लिखा जा सकता है।

function countProperties(obj) {
    return Object.keys(obj).length;
}

ध्यान रखें कि आप उन संपत्तियों को भी मिस कर देंगे, जो एन्युमरेबल नहीं हैं (उदाहरण के लिए एरे length)।

यदि आप jQuery, प्रोटोटाइप, Mootools, $ जो भी नवीनतम-प्रचार की तरह एक फ्रेमवर्क का उपयोग कर रहे हैं, तो जांचें कि क्या वे अपने स्वयं के संग्रह एपीआई के साथ आते हैं, जो देशी जेएस वस्तुओं का उपयोग करने से आपकी समस्या का बेहतर समाधान हो सकता है।


11
यह मैं हमेशा भूल गया है। .NET भूमि में बहुत समय मैं आपको बताता हूं। +1
annakata

2
jQuery अपने संग्रह के लिए एक ऑब्जेक्ट का उपयोग करता है जो इसे प्रश्नों से मिलता है, और यह एक लंबी संपत्ति के साथ उस मूल्य को उजागर करता है।
नोसरेडना

6
फ़ायरफ़ॉक्स 4 __count__चला गया है :(
टिमो हुओवेंन

1
क्या इसके लिए कोई तरीका नहीं है? मैं एक ही प्रकार के बाँध में हूँ, लेकिन यदि संभव हो तो मैं इसे JSLint पास करना चाहता हूँ।
स्ट्रीटलाइट

1
हमें आवश्यकता क्यों है hasOwnProperty()?
स्विसविस

99

किसी भी ES5- संगत वातावरण में ऐसा करने के लिए

Object.keys(obj).length

( यहां से ब्राउजर सपोर्ट )
(डॉक ऑन ऑब्जेक्ट । यहां पर वह विधि शामिल है जिसे आप गैर-ईसीएमए 5 ब्राउजर में जोड़ सकते हैं)


2
इस जवाब को सामने रखना सही सवाल नहीं है। इसके साथ आप ऑब्जेक्ट की सभी चाबियों को ले जा रहे हैं, उन्हें एक नए बनाए गए सरणी में डाल रहे हैं और फिर उस नए सरणी से लंबाई की संपत्ति को पुनः प्राप्त कर रहे हैं।
GetFree

11
यह सबसे अधिक प्रोग्रामेटिक रूप से कुशल नहीं हो सकता है, लेकिन यह सबसे अधिक कुशल डेवलपर है।
सुपरलुमिनरी

9

यदि आप पहले से ही अपने निर्माण में jQuery का उपयोग कर रहे हैं तो बस यह करें:

$(yourObject).length

यह वस्तुओं पर मेरे लिए अच्छी तरह से काम करता है, और मैं पहले से ही निर्भरता के रूप में jQuery था।


5
अजीब बात है ... यह मेरे लिए काम नहीं करता है। मुझे हमेशा 1. जेल्कीएन का जवाब मेरे लिए काम आता है।
माइक कृंतक

3
यह कोड हमेशा 1 वापस आता है। सिर्फ 1 ऑब्जेक्ट। इसमें तत्वों की गिनती नहीं की जा रही है
BeRocket

5
function count(){
    var c= 0;
    for(var p in this) if(this.hasOwnProperty(p))++c;
    return c;
}

var O={a: 1, b: 2, c: 3};

count.call(O);

2

AFAIK, यह मज़बूती से करने का कोई तरीका नहीं है, जब तक कि आप किसी ऐरे पर स्विच न करें। जो ईमानदारी से, अजीब नहीं लगता है - यह मेरे लिए बहुत सीधा लगता है कि सरणियाँ गणनीय हैं, और ऑब्जेक्ट नहीं हैं।

संभवत: निकटतम आपको कुछ इस तरह मिलेगा

// Monkey patching on purpose to make a point
Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this ) i++;
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 3

लेकिन यह समस्याएँ पैदा करता है, या कम से कम प्रश्न। सभी उपयोगकर्ता-निर्मित गुणों की गणना की जाती है, जिसमें _length फ़ंक्शन भी शामिल है! और इस सरल उदाहरण में आप केवल एक सामान्य फ़ंक्शन का उपयोग करके इससे बच सकते हैं, इसका मतलब यह नहीं है कि आप अन्य स्क्रिप्ट को ऐसा करने से रोक सकते हैं। तो तुम क्या करते हो? फ़ंक्शन गुणों को अनदेखा करें?

Object.prototype.length = function()
{
  var i = 0;
  for ( var p in this )
  {
      if ( 'function' == typeof this[p] ) continue;
      i++;
  }
  return i;
}

alert( {foo:"bar", bar: "baz"}.length() ); // alerts 2

अंत में, मुझे लगता है कि आपको शायद अपनी वस्तुओं को गिनने योग्य बनाने के विचार को खोदना चाहिए और जो भी आप कर रहे हैं उसे करने के लिए एक और तरीका निकालना चाहिए।


8
डांसर रॉबिनसन होगा! क्या नहीं वस्तु के खिलाफ आद्य! सब कुछ ऑब्जेक्ट से उतरता है, आप ग्राहक प्रसंस्करण को इस तरह से अपंग करेंगे यदि आप जेएस काम की कोई बड़ी राशि कर रहे हैं।
अन्नकूट

5
उह ... क्या आपने उस हिस्से को नहीं पढ़ा जहां मैंने एक टिप्पणी में लिखा था "बंदर ने एक बिंदु बनाने के उद्देश्य से पैचिंग की" - c'mon, मैंने ऐसा जानबूझकर किया ताकि लोग इसके बारे में थोड़ा भी फ्लिप न करें। इसके अलावा, भले ही मैं नहीं वकील बंदर पैचिंग करते हैं, आप गलत कैसे प्रोटोटाइप श्रृंखला जावास्क्रिप्ट में काम करता है अगर आपको लगता है इस प्रदर्शन के मुद्दों का कारण होगा video.yahoo.com/watch/111585/1027823
पीटर बेली

तो .. यह एक है या नहीं?
ऑस्कररेज़

"जावास्क्रिप्ट: द गुड पार्ट्स" में, वह एक "क्रिएट ()" विधि के साथ ऑब्जेक्ट को प्रोटोटाइप करता है। मुझे लगता है कि जावास्क्रिप्ट पर निश्चित पुस्तक है।
क्रिस डट्रो

1

संख्या / लंबाई / आयामीता की अवधारणा वास्तव में एक वस्तु के लिए समझ में नहीं आती है, और इसकी आवश्यकता है कि आप वास्तव में मेरे लिए एक ऐरे चाहते हैं।

संपादित करें: मुझे बताया कि आप इसके लिए एक O (1) चाहते हैं। मेरे ज्ञान का सबसे अच्छा करने के लिए कोई ऐसा तरीका मौजूद नहीं है जिससे मुझे डर लगता है


उन्होंने खुद को पुनरावृत्त करने का प्रस्ताव दिया, जिसका यह समाधान है। उसे इसे हासिल करने के लिए एक O (1) तरीके की आवश्यकता थी ...
थॉमस हैनसेन

आप बिल्कुल सही हैं। वास्तव में प्रश्नों को अधिक अच्छी तरह से पढ़ना चाहिए।
अन्नकूट

दरअसल, JS में मैप्स के लिए ऑब्जेक्ट्स सबसे नज़दीकी चीज़ हैं। नक्शे की लंबाई होती है।
क्रिस्टियन व्राबी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.