जावास्क्रिप्ट में किसी वस्तु की कुंजियों / गुणों की संख्या की कुशलता से गणना कैसे करें?


1543

किसी वस्तु की कुंजियों / गुणों की संख्या को गिनने का सबसे तेज़ तरीका क्या है? वस्तु पर पुनरावृति के बिना ऐसा करना संभव है? यानी बिना किए

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;

(फ़ायरफ़ॉक्स ने एक जादुई __count__संपत्ति प्रदान की , लेकिन इसे संस्करण 4 के आसपास कहीं हटा दिया गया था)



2
अलग-अलग तरीकों के लिए एक प्रदर्शन बेंचमार्क: jsben.ch/#/oSt2p
EscapeNetscape

जवाबों:


2513

किसी भी ES5- संगत वातावरण में ऐसा करने के लिए , जैसे कि Node , Chrome, IE 9+, Firefox 4+, या Safari 5+:

Object.keys(obj).length

8
न सिर्फ नोड.जेएस, लेकिन कोई भी वातावरण जो
Yi Jiang

59
BTW ... बस कुछ परीक्षण किए गए ... यह विधि O (n) समय में चलती है। लूप के लिए इस विधि की तुलना में बहुत बुरा नहीं है। ** उदास चेहरा ** stackoverflow.com/questions/7956554/…
बीएमएनआर

161
-1 (-200 अगर मैं कर सकता था) यह न केवल ऑब्जेक्ट के माध्यम से पुनरावृत्ति करता है, बल्कि इसके सभी कुंजी के साथ एक नया सरणी बनाता है, इसलिए यह प्रश्न का उत्तर देने में पूरी तरह से विफल हो जाता है।
GetFree

42
यह (कम से कम क्रोम 25 पर) करने के लिए बहुत तेज़ लगता है: jsperf.com/count-elements-in-object
fserb

34
@GetFree इतने सारे अंगूठे क्यों? कोडिंग के मामले में यह निश्चित रूप से सबसे तेज़ तरीका है। कोई अतिरिक्त विधि या पुस्तकालयों की आवश्यकता नहीं है। कोड गति के संदर्भ में, जाहिर है यह बहुत बुरा भी नहीं है। पूरी तरह से असफल नहीं। 87 अंगूठा आपके लिए फेल है।
एंड्रयू

150

आप इस कोड का उपयोग कर सकते हैं:

if (!Object.keys) {
    Object.keys = function (obj) {
        var keys = [],
            k;
        for (k in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, k)) {
                keys.push(k);
            }
        }
        return keys;
    };
}

फिर आप पुराने ब्राउज़र में भी इसका उपयोग कर सकते हैं:

var len = Object.keys(obj).length;

2
जाँच का उद्देश्य क्या है (Object.prototype.hasOwnProperty.call(obj, k))?
स्टाइलफेल

14
@styfle यदि आप ऑब्जेक्ट के गुणों पर पुनरावृति करने के लिए एक लूप के लिए उपयोग करते हैं, तो आपको प्रोटोोटाइप श्रृंखला में गुण भी मिलते हैं। इसलिए जाँच hasOwnPropertyआवश्यक है। यह केवल वस्तु पर निर्धारित गुण देता है।
रेनाट डी मुइनक

13
@styfle इसे सरल बनाने के लिए आप बस लिख सकते हैं obj.hasOwnProperty(k)(मैंने वास्तव में अपने मूल पोस्ट में ऐसा किया था, लेकिन बाद में इसे अपडेट किया)। hasOwnPropertyहर वस्तु पर उपलब्ध है क्योंकि यह Objectप्रोटोटाइप का हिस्सा है , लेकिन दुर्लभ घटना में इस पद्धति को हटा दिया जाएगा या ओवरराइड करने पर आपको अप्रत्याशित परिणाम मिल सकते हैं। इसे कॉल करने से Object.prototypeयह थोड़ा और मजबूत हो जाता है। उपयोग करने का कारण यह callहै कि आप objप्रोटोटाइप के बजाय विधि को लागू करना चाहते हैं ।
रेनाट डी मुयंक

6
क्या इस संस्करण का उपयोग करना बेहतर नहीं होगा? developer.mozilla.org/en-US/docs/JavaScript/Reference/…
जेवियर डेलमोटे

1
@XavierDelamotte आप बिल्कुल सही हैं। जबकि मेरा संस्करण काम करता है, यह एक उदाहरण के रूप में बहुत बुनियादी और मानसिक है। मोज़िला का कोड अधिक सुरक्षित है। (पुनश्च: आपका लिंक भी स्वीकृत उत्तर में है)
रेनाट डी मुइनक

137

यदि आप Underscore.js का उपयोग कर रहे हैं, तो आप _.size (धन्यवाद @douwe) का उपयोग कर सकते हैं :
_.size(obj)

वैकल्पिक रूप से आप _.key का उपयोग भी कर सकते हैं जो कुछ के लिए स्पष्ट हो सकता है:
_.keys(obj).length

मैं बहुत सी बुनियादी चीजों को करने के लिए एक तंग पुस्तकालय, अंडरस्कोर की अत्यधिक अनुशंसा करता हूं। जब भी संभव हो वे ECMA5 से मेल खाते हैं और मूल कार्यान्वयन को टालते हैं।

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


9
यदि आप अंडरस्कोर का उपयोग करते हैं। तो आपको इसके बजाय _.size का उपयोग करना चाहिए। अच्छी बात यह है कि यदि आप किसी भी तरह से ऐज से ऑब्जेक्ट पर स्विच करते हैं या इसके विपरीत रिजल्ट वही रहता है।
डउवे

2
और मेरी समझ से आमदनी आमतौर पर अंडरस्कोर से बेहतर है (हालांकि वे इसी तरह की चीजें करते हैं)।
मेरलिन मॉर्गन-ग्राहम

1
@ मेरलिनमर्गन-ग्राहम अगर मुझे सही ढंग से याद है, तो लॉश मूल रूप से अंडरस्कोर का एक कांटा है ...
molson504x

6
_.keys(obj).lengthमेरे लिए सबसे अच्छा काम किया है, क्योंकि मेरी वापसी वस्तु कभी-कभी एक सादे स्ट्रिंग होती है, जिसके भीतर कोई गुण नहीं होता है। _.size(obj)मुझे वापस स्ट्रिंग की लंबाई देता है, जबकि _.keys(obj).lengthरिटर्न 0.
जैकब स्टैम

O (n) जटिलता । लॉडश और अंडरस्कोर Object.keysआंतरिक रूप से उपयोग करते हैं। for..inयदि Object.keysपरिभाषित नहीं किया गया है तो अंडरस्कोर हर कुंजी को एक लूप के अंदर सरणी में कॉपी करता है।
एन। कुद्रीवत्सेव

82

मानक ऑब्जेक्ट कार्यान्वयन ( 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;

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


क्यों var k in myobjबढ़ेगा प्रदर्शन? जहाँ तक मुझे पता है, केवल फ़ंक्शंस जावास्क्रिप्ट में नए दायरे की घोषणा करते हैं। क्या इस नियम में अपवाद हैं?
लार्स सिरप ब्रिंक नीलसन

1
क्या यह तेज है? for (var k in myobj) hasOwn.call(myobj, k) && ++count;यानी एक सरल और& के साथ अगर बयान की जगह?
हमजा कुब्बा

अंतिम बात यह है कि आप के साथ कर सकते हैं: Object.getOwnPropertyNames(obj).length; बहुत सरल।
विल्ट

29

यदि आप वास्तव में एक प्रदर्शन समस्या में चल रहे हैं, तो मैं एक ऐसी फ़ंक्शन के साथ / से गुणों को जोड़ने / हटाने वाली कॉलों को लपेटने का सुझाव दूंगा जो एक उचित रूप से नामित (आकार?) संपत्ति में वृद्धि / कमी भी करते हैं।

आपको केवल एक बार गुणों की प्रारंभिक संख्या की गणना करने और वहां से आगे बढ़ने की आवश्यकता है। यदि कोई वास्तविक प्रदर्शन समस्या नहीं है, तो परेशान न करें। बस एक फ़ंक्शन में कोड के उस बिट को लपेटो getNumberOfProperties(object)और इसके साथ किया जाए।


4
@hitautodestruct क्योंकि वह एक समाधान प्रदान करता है।
क्रश

@ क्रश यह उत्तर प्रत्यक्ष समाधान देने के बजाय चीजों को करने के लिए सुझाव देता है।
hitautodestruct

5
@hitautodestruct इसका उत्तर देता है: जोड़ने / हटाने के तरीकों के साथ एक एन्कैप्सुलेटेड संख्या को बढ़ाना / घटाना। नीचे इस तरह का एक और जवाब है। फर्क सिर्फ इतना है, कन्फ्यूजन ने कोई कोड पेश नहीं किया। उत्तर केवल कोड समाधान प्रदान करने के लिए अनिवार्य नहीं हैं।
क्रश करें

1
यह सही नहीं हो सकता ... लेकिन अन्य "उत्तरों" की तुलना में यह कुछ स्थितियों के लिए सबसे अच्छा समाधान हो सकता है
d.raev

1
अब तक यह एकमात्र समाधान है जो मैं देख रहा हूं कि ओ (1) निरंतर समय प्रदर्शन जटिलता है, और इसलिए एकमात्र समाधान है जो "बिना पुनरावृत्ति" के प्रश्न के विवरण का उत्तर देता है और इसलिए ट्रू स्वीकृत उत्तर होना चाहिए। अधिकांश नहीं तो अन्य सभी उत्तर इसका जवाब नहीं देते हैं, क्योंकि वे एक ओ (एन) रैखिक समय प्रदर्शन जटिलता प्रदान करते हैं; यह 1-लाइन समाधान के लिए भी मामला है जो कुछ .keys () फ़ंक्शन की तरह कॉल करता है, क्योंकि ऐसे फ़ंक्शन कॉल O (n) हैं।
cellepo

17

जैसा कि एवी फ्लैक्स https://stackoverflow.com/a/4889658/1047014 ने कहा है

Object.keys(obj).length

अपनी वस्तु पर सभी गणना करने योग्य गुणों के लिए चाल चलेगा, लेकिन उन गैर-असंख्य गुणों को भी शामिल कर सकता है जिनका आप उपयोग कर सकते हैं Object.getOwnPropertyNames। यहाँ अंतर है:

var myObject = new Object();

Object.defineProperty(myObject, "nonEnumerableProp", {
  enumerable: false
});
Object.defineProperty(myObject, "enumerableProp", {
  enumerable: true
});

console.log(Object.getOwnPropertyNames(myObject).length); //outputs 2
console.log(Object.keys(myObject).length); //outputs 1

console.log(myObject.hasOwnProperty("nonEnumerableProp")); //outputs true
console.log(myObject.hasOwnProperty("enumerableProp")); //outputs true

console.log("nonEnumerableProp" in myObject); //outputs true
console.log("enumerableProp" in myObject); //outputs true

जैसा कि यहां कहा गया है कि इसमें उसी ब्राउज़र का समर्थन है जैसा किObject.keys

हालाँकि, ज्यादातर मामलों में, आप इस प्रकार के ऑपरेशनों में नॉनम्यूमेरिबल्स को शामिल नहीं करना चाह सकते हैं, लेकिन अंतर जानना हमेशा अच्छा होता है;)


1
उल्लेख के लिए अंगूठे Object.getOwnPropertyNamesआप यहां केवल एक थे ...
विल्ट

15

मुझे ऐसा करने के किसी भी तरीके के बारे में पता नहीं है, हालाँकि पुनरावृत्तियों को न्यूनतम रखने के लिए, आप की __count__मौजूदगी के लिए जाँच करने का प्रयास कर सकते हैं और यदि यह मौजूद नहीं है (अर्थात फ़ायरफ़ॉक्स नहीं) तो आप ऑब्जेक्ट पर पुनरावृति कर सकते हैं और परिभाषित कर सकते हैं यह बाद के उपयोग के लिए जैसे:

if (myobj.__count__ === undefined) {
  myobj.__count__ = ...
}

इस तरह से समर्थन करने वाले किसी भी ब्राउज़र __count__का उपयोग होगा, और पुनरावृत्तियों केवल उन लोगों के लिए किया जाएगा जो नहीं करते हैं। यदि गिनती बदल जाती है और आप ऐसा नहीं कर सकते हैं, तो आप इसे हमेशा एक समारोह बना सकते हैं:

if (myobj.__count__ === undefined) {
  myobj.__count__ = function() { return ... }
  myobj.__count__.toString = function() { return this(); }
}

इस तरह कभी भी आप myobj का संदर्भ लेते हैं। __count__समारोह आग और पुनर्गणना होगा।


13
ध्यान दें कि Object.prototype.__count__जेको 1.9.3 में हटाया जा रहा है: whereswalden.com/2010/04/06/… गिनती -प्रतिरोधी-की-वस्तुएं-को-हटाया जा रहा है /
dshw

17
अब जब फ़ायरफ़ॉक्स 4 बाहर हो गया है, तो यह उत्तर अब अप्रचलित है। Object.__count__चला गया है, और अच्छी लकीर भी।
यी जियांग

1
मैं यह नहीं कहूंगा कि उत्तर अप्रचलित है। किसी फ़ंक्शन में मान को एनकोड करना अभी भी एक दिलचस्प रणनीति है।
devios1

विस्तार करने के लिए प्रोटोटाइप वस्तु का उपयोग किया जाना चाहिए
अरिया कार्टर-वीर

13

एवी फ्लैक्स उत्तर पर iterate करने के लिए Object.keys (obj) .length उस ऑब्जेक्ट के लिए सही है, जिसके पास कार्य करने के लिए बंधा नहीं है

उदाहरण:

obj = {"lol": "what", owo: "pfft"};
Object.keys(obj).length; // should be 2

बनाम

arr = [];
obj = {"lol": "what", owo: "pfft"};
obj.omg = function(){
    _.each(obj, function(a){
        arr.push(a);
    });
};
Object.keys(obj).length; // should be 3 because it looks like this 
/* obj === {"lol": "what", owo: "pfft", omg: function(){_.each(obj, function(a){arr.push(a);});}} */

इससे बचने के उपाय:

  1. किसी ऑब्जेक्ट में फ़ंक्शंस न रखें, जिसमें आप कुंजियों की संख्या गिनना चाहते हैं

  2. एक अलग वस्तु का उपयोग करें या विशेष रूप से कार्यों के लिए एक नई वस्तु बनाएं (यदि आप गणना करना चाहते हैं कि फ़ाइल में कितने कार्य हैं Object.keys(obj).length)

हाँ, मैंने अपने उदाहरण में नोडज से _ या अंडरस्कोर मॉड्यूल का उपयोग किया है

दस्तावेज़ीकरण यहाँ पाया जा सकता है http://underscorejs.org/ और साथ ही इसके स्रोत गितुब और विभिन्न अन्य जानकारी पर

और अंत में एक लॉश कार्यान्वयन https://lodash.com/docs#size

_.size(obj)


के बारे में आपकी टिप्पणी के जवाब में Array(obj).length: यह काम नहीं करता है। http://jsfiddle.net/Jhy8M/
जेमी चोंग

हाँ, मैं इसे थोड़ा अधिक im में देखा जा रहा है अगर संभव हो तो इस उत्तर को समाप्त करने के लिए जा रहा हूं या बस इसे एक साथ संपादित कर रहा
हूं

मैं यह नहीं देख रहा हूं कि इसका कार्य के लिए कुछ भी है, एक के लिए, और क्रोम में मुझे यह व्यवहार बिल्कुल नहीं दिखता है। मुझे संदेह है कि यह Object.defineProperty (): enumerable के डिफ़ॉल्ट व्यवहार के साथ करना पड़ सकता है false, जो कि है , हालांकि मुझे अभी तक इस बात पर कोई दस्तावेज नहीं मिला है कि W3 की एक अलग व्याख्या / शब्दार्थ var obj = { a: true, b: true }से अलग कैसे हो सकती है var obj = {}; obj.a = true; obj.b = true;या बस क्रोम द्वारा अपनाया गया।
नोलो

10

जैसा कि ऊपर बताया गया है: Object.keys(obj).length

लेकिन: जैसा कि हमारे पास अब ES6 में एक वास्तविक मानचित्र वर्ग है, मैं किसी वस्तु के गुणों का उपयोग करने के बजाय इसका उपयोग करने का सुझाव दूंगा ।

const map = new Map();
map.set("key", "value");
map.size; // THE fastest way

8

उन लोगों के लिए जिनके पास अंडरस्कोर है। उनके प्रोजेक्ट में शामिल हैं जो आप कर सकते हैं:

_({a:'', b:''}).size() // => 2

या कार्यात्मक शैली:

_.size({a:'', b:''}) // => 2

8

यहां तीन तरीकों के लिए कुछ प्रदर्शन परीक्षण हैं;

https://jsperf.com/get-the-number-of-keys-in-an-object

Object.keys ()। लंबाई

20,735 संचालन प्रति सेकंड

बहुत सरल और संगत। तेजी से चलता है, लेकिन महंगा है क्योंकि यह चाबियों का एक नया सरणी बनाता है, जो फिर फेंक दिया जाता है।

return Object.keys(objectToRead).length;

कुंजियों के माध्यम से पाश

15,734 संचालन प्रति सेकंड

let size=0;
for(let k in objectToRead) {
  size++
}
return size;

थोड़ा धीमा, लेकिन कहीं भी स्मृति उपयोग के पास नहीं है, इसलिए शायद बेहतर हो अगर आप मोबाइल या अन्य छोटी मशीनों के लिए अनुकूलित करने में रुचि रखते हैं

ऑब्जेक्ट के बजाय मैप का उपयोग करना

953,839,338 संचालन प्रति सेकंड

return mapToRead.size;

मूल रूप से, मानचित्र अपने स्वयं के आकार को ट्रैक करता है इसलिए हम सिर्फ एक नंबर फ़ील्ड लौटा रहे हैं। दूर, किसी भी अन्य विधि की तुलना में तेजी से। यदि आपके पास ऑब्जेक्ट का नियंत्रण है, तो उन्हें नक्शे में बदले।


6

प्रेषक: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Object.defineProperty (obj, प्रोप, डिस्क्रिप्टर)

आप इसे अपनी सभी वस्तुओं में जोड़ सकते हैं:

Object.defineProperty(Object.prototype, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

या एक ही वस्तु:

var myObj = {};
Object.defineProperty(myObj, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

उदाहरण:

var myObj = {};
myObj.name  = "John Doe";
myObj.email = "leaked@example.com";
myObj.length; //output: 2

इस तरह से जोड़ा गया, यह for..in लूप्स में प्रदर्शित नहीं होगा:

for(var i in myObj) {
     console.log(i + ":" + myObj[i]);
}

आउटपुट:

name:John Doe
email:leaked@example.com

नोट: यह <IE9 ब्राउज़रों में काम नहीं करता है।


यदि आप बिल्ट-इन प्रोटोटाइप या पॉलीफ़िल का विस्तार करने जा रहे हैं, तो कृपया इसे सही तरीके से करें: फॉरवर्ड कम्पैटिबिलिटी, चेक करें कि क्या प्रॉपर्टी पहले मौजूद है, तो प्रॉपर्टी को नॉन-एनेमरेबल बनाएं ताकि खुद की कीज़ निर्मित वस्तुओं को प्रदूषित नहीं किया जाता है। विधियों के लिए का उपयोग वास्तविक तरीकों । मेरी सिफारिश: इन उदाहरणों का पालन करें जो एक विधि जोड़ने के लिए प्रदर्शित करते हैं जो अंतर्निहित तरीकों की तरह निकटता से व्यवहार करता है।
user4642212

5

मैंने इस समस्या को कैसे हल किया है, एक मूल सूची के अपने कार्यान्वयन का निर्माण करना है जो इस बात का रिकॉर्ड रखता है कि ऑब्जेक्ट में कितने आइटम संग्रहीत हैं। यह बहुत सरल है। कुछ इस तरह:

function BasicList()
{
   var items = {};
   this.count = 0;

   this.add = function(index, item)
   {
      items[index] = item;
      this.count++;
   }

   this.remove = function (index)
   {
      delete items[index];
      this.count--;
   }

   this.get = function(index)
   {
      if (undefined === index)
        return items;
      else
        return items[index];
   }
}

1
दिलचस्प विकल्प। यह एक समग्र गिनती फ़ंक्शन के ओवरहेड को समाप्त करता है, लेकिन एक फ़ंक्शन कॉल की लागत पर हर बार जब आप एक तत्व जोड़ते हैं या निकालते हैं, जो दुर्भाग्य से बदतर हो सकता है। मैं डेटा एन्कैप्सुलेशन और कस्टम तरीकों के लिए इस तरह की एक सूची कार्यान्वयन का उपयोग करता हूं, यह एक सादे सरणी की तुलना में प्रदान कर सकता है, लेकिन तब नहीं जब मुझे सिर्फ तेज़ आइटम की आवश्यकता होती है।
लुक 125

1
मुझे आपका उत्तर पसंद है, लेकिन मैं एक लेमिंग भी हूं और क्लिक किया। यह एक दिलचस्प दुविधा प्रस्तुत करता है। आप अपने निर्देशों में कुछ व्यवहार के लिए लेखांकन नहीं कर रहे हैं, जैसे कि मेरी स्थिति जहां मैंने आपके उत्तर को पहले से ही अपटूडेट कर दिया है, लेकिन फिर मुझे "upvote" पर क्लिक करने का निर्देश दिया जा सकता है और नहीं। निर्देश चुपचाप विफल हो जाता है, लेकिन मैं एसओ पर आपकी सामग्री से यहां इकट्ठा होता हूं कि चुपचाप विफल होना कुछ ऐसा नहीं है जो आपको अपना कोड पसंद है। बिलकुल चौकन्ना।
L0j1k

1
मैं वास्तव में इस जवाब को पसंद करता हूं, अच्छा डेटा संरचना। अगर ऐड पर फंक्शन कॉल्स के साथ परफॉर्मेंस इफेक्ट होता है, तो ऑब्जेक्ट पर इटरेट करने से कहीं ज्यादा परफॉर्मेंस बूस्ट होगा। यह सबसे तेज़ पाश के लिए अनुमति देना चाहिएvar i = basiclist.count while(i--){...}
लेक्स

कम से कम एक बुनियादी सूची में बुनियादी चेक शामिल नहीं होना चाहिए? जैसे चेक करना कि क्या addकोई पुरानी वस्तु की जगह या यदि removeगैर-मौजूदा सूचकांक के साथ कहा जाता है। यह भी जांचना संभव नहीं है कि क्या सूची में एक दिया गया सूचकांक है यदि undefinedएक वैध वस्तु मूल्य है।
रॉबर्ट

2
एक सूची का आदेश दिया जाना चाहिए और पुनरावृत्त होना चाहिए। डेटा को एक ऑब्जेक्ट में संग्रहीत किया जाता है ताकि तत्वों के आदेश पर कोई गारंटी न हो। आप इसमें छेद वाली लंबाई की सूची कैसे पाते हैं? this.count? उच्चतम सूचकांक मूल्य? यदि आप कभी भी एक ही इंडेक्स में दो आइटम जोड़ते हैं तो गिनती एक त्रुटि स्थिति में चली जाती है।
परम गोब्बलमेंट

4

आप Object.keys(data).lengthJSON ऑब्जेक्ट की प्रमुख डेटा को खोजने के लिए उपयोग कर सकते हैं


3

उन लोगों के लिए जो अपने प्रोजेक्ट में एक्सट जेएस 4 कर सकते हैं:

Ext.Object.getSize(myobj);

इसका लाभ यह है कि यह सभी एक्सट्रीम संगत ब्राउज़र (IE6-IE8 शामिल) पर काम करेगा, हालांकि, मेरा मानना ​​है कि रनिंग टाइम O (n) से बेहतर नहीं है, हालांकि अन्य सुझाए गए समाधानों की तरह।


2

आप उपयोग कर सकते हैं:

Object.keys(objectName).length; 

तथा

Object.values(objectName).length;

1

ओपी ने निर्दिष्ट नहीं किया कि क्या वस्तु एक नोडलिस्ट है, अगर यह है तो आप सीधे उस पर लंबाई विधि का उपयोग कर सकते हैं। उदाहरण:

buttons = document.querySelectorAll('[id=button)) {
console.log('Found ' + buttons.length + ' on the screen'); 

0

यदि ऊपर jQuery काम नहीं करता है, तो प्रयास करें

$(Object.Item).length

3
ऐसा लगता है कि Object.Itemमौजूद नहीं है
Luc125

-1

मुझे नहीं लगता कि यह संभव है (कम से कम कुछ इंटर्नल का उपयोग किए बिना नहीं)। और मुझे नहीं लगता कि आप इसे अनुकूलित करके बहुत कुछ हासिल करेंगे।


2
स्वीकार किए गए उत्तर से पता चलता है कि यह किया जा सकता है, और आपके पास यह दावा करने के लिए कोई संदर्भ नहीं है कि लाभ के लिए कुछ भी नहीं है।
नाली

-1

मैं इसे इस तरह से सभी ऑब्जेक्ट के लिए उपलब्ध कराने की कोशिश करता हूं:

Object.defineProperty(Object.prototype, "length", {
get() {
    if (!Object.keys) {
        Object.keys = function (obj) {
            var keys = [],k;
            for (k in obj) {
                if (Object.prototype.hasOwnProperty.call(obj, k)) {
                    keys.push(k);
                }
            }
            return keys;
        };
    }
    return Object.keys(this).length;
},});

console.log({"Name":"Joe","Age":26}.length) //returns 2

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