जावास्क्रिप्ट ऑब्जेक्ट की लंबाई


2382

मेरे पास एक जावास्क्रिप्ट ऑब्जेक्ट है, क्या इस ऑब्जेक्ट की लंबाई प्राप्त करने के लिए एक अंतर्निहित या स्वीकृत सर्वोत्तम अभ्यास तरीका है?

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

14
जावास्क्रिप्ट में ऑब्जेक्ट शाब्दिक डिफ़ॉल्ट साहचर्य सरणियों द्वारा होते हैं जैसे ऑब्जेक्ट
।propertyName.propertyValue

6
Underscore.js में एक-लाइनर जोड़ा गया जो ऐसा करता है: stackoverflow.com/a/11346637/11236
ripper234

31
एक बार लाइन उत्तर Object.keys (myArray) का उपयोग करें। @aeosynth ने कहा।
राणाधीर रेड्डी

67
ठीक है, कैसे के बारे मेंObject.keys(obj).length
मुहम्मद उमर

5
ऑब्जेक्ट मान्य क्यों नहीं है? यह मेरे लिए सही परिणाम देता है।
एड्रियन एम

जवाबों:


2621

सबसे मज़बूत उत्तर (यानी जो सबसे कम कीड़े पैदा करते समय आप जो करने की कोशिश कर रहे हैं, उसके इरादे को पकड़ लेता है):

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myObj);

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


यहां 2016 तक अपडेट और ES5 और उससे आगे की व्यापक तैनाती है। IE9 + और अन्य सभी आधुनिक ES5 + सक्षम ब्राउज़रों के लिए, आप Object.keys()उपरोक्त कोड का उपयोग कर सकते हैं :

var size = Object.keys(myObj).length;

Object.keys()अब इसमें बने किसी भी मौजूदा प्रोटोटाइप को संशोधित करने की आवश्यकता नहीं है ।

संपादित करें : ऑब्जेक्ट में प्रतीकात्मक गुण हो सकते हैं जो Object.key विधि के माध्यम से वापस नहीं किए जा सकते हैं। तो उनका उल्लेख किए बिना उत्तर अधूरा होगा।

ऑब्जेक्ट प्रॉपर्टी के लिए अद्वितीय पहचानकर्ता बनाने के लिए भाषा में सिंबल प्रकार जोड़ा गया था। प्रतीक प्रकार का मुख्य लाभ ओवरराइट की रोकथाम है।

Object.keysया Object.getOwnPropertyNamesप्रतीकात्मक गुणों के लिए काम नहीं करता है। उन्हें वापस करने के लिए आपको उपयोग करने की आवश्यकता है Object.getOwnPropertySymbols

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

65
@Tres - यदि कोई व्यक्ति आपके पास कोड में कहीं पहले से ही घोषित किए बिना 'आकार' की संपत्ति पर आ जाता है, तो आपका कोड तोड़ा जा सकता है, इसलिए यह हमेशा जांच के लायक है कि क्या यह पहले से ही परिभाषित है
vsync

19
@vsync आप बहुत सही हैं। हमेशा आवश्यक स्वच्छता जांच लागू करनी चाहिए :)
Tres

132
हर कोई इसे क्यों नजरअंदाज कर रहा है:Object.keys(obj).length
मुहम्मद उमर

33
@MuhammadUmer शायद क्योंकि यह विधि तब भी मौजूद नहीं थी जब यह उत्तर लिखा गया था। आज भी, इसका उपयोग करने के लिए संभवतः पुराने ब्राउज़रों के लिए पॉलीफिल की आवश्यकता होगी।
क्रिस हेयस

21
@stonyau IE8, IE9, IE10 मृत ब्राउज़र हैं जिन्हें Microsoft का समर्थन नहीं मिलता है। IE8, IE9, IE10 उपयोगकर्ता को Microsoft से सूचना मिलती है, कि वे पुराने, असमर्थित ब्राउज़र का उपयोग करते हैं और उन्हें यह उम्मीद करनी चाहिए कि सामान उनके लिए काम नहीं करेगा। support.microsoft.com/en-us/kb/3123303
Lukas Liesis

1704

यदि आप जानते हैं कि आपको hasOwnPropertyचेक के बारे में चिंता करने की आवश्यकता नहीं है , तो आप इसे बहुत सरलता से कर सकते हैं:

Object.keys(myArray).length

23
क्यों नहीं? मुझे जो पता है, वह एक मानक है: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
vsync

104
यह एक सार्वभौमिक रूप से कार्यान्वित विधि नहीं है, लेकिन आप इस तालिका के साथ कौन से ब्राउज़र का समर्थन करता है यह जांच सकते हैं ।
aeosynth

51
कोई IE8 समर्थन = नहीं जाना।
ripper234

22
फ़ायरफ़ॉक्स = दुर्भाग्य से स्विच करने का समय, आप स्विचिंग का मतलब अपनी वेबसाइट के उपयोगकर्ताओं से नहीं करेंगे ...
mdup

82
@ ripper234 no IE सपोर्ट = पॉलीफिल को समय
जॉन ड्वोरक

287

अपडेट किया गया : यदि आप अंडरस्कोर का उपयोग कर रहे हैं। जेएस (अनुशंसित, यह हल्का है!), तो आप बस कर सकते हैं

_.size({one : 1, two : 2, three : 3});
=> 3

यदि नहीं , और आप जो भी कारण के लिए वस्तु गुणों के साथ गड़बड़ नहीं करना चाहते हैं, और पहले से ही jQuery का उपयोग कर रहे हैं, एक प्लगइन समान रूप से सुलभ है:

$.assocArraySize = function(obj) {
    // http://stackoverflow.com/a/6700/11236
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

7
_.size()मेरे उल्का परियोजना के लिए सही समाधान था , जिसमें अंडरस्कोर है। जेएस समर्थन।
टुकेकोएरेबल 17

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

3
अंडरस्कोर> (सभी - ['लो-डैश'])
रेयाज

अंडरस्कोरज, चीजें जो जेएस के तहत होनी चाहिए :)
मिन्हाजुल

1
@Bydydead को विरासत में मिली वस्तु के वास्तविक गुणों को अलग करने के लिए। developer.mozilla.org/en/docs/Web/JavaScript/Reference/…
ripper234

56

यहां सबसे क्रॉस-ब्राउज़र समाधान है।

यह स्वीकार किए गए उत्तर से बेहतर है क्योंकि यह मूल Object.keys का उपयोग करता है यदि मौजूद है। इस प्रकार, यह सभी आधुनिक ब्राउज़रों के लिए सबसे तेज़ है।

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

Object.keys(obj).length;

6
Object.keys()एक सरणी देता है जिसमें केवल उन्हीं गुणों के नाम शामिल होते हैं जो असंख्य हैं। यदि आप सभी गुणों के साथ एक सरणी चाहते हैं, तो आपको Object.getOwnPropertyNames()इसके बजाय उपयोग करना चाहिए । देखें डेवलपर.
mozilla.org/en/docs/Web/JavaScript/Reference/…

35

मैं एक जावास्क्रिप्ट विशेषज्ञ नहीं हूं, लेकिन ऐसा लगता है कि आपको तत्वों के माध्यम से लूप करना होगा और उन्हें गिनना होगा क्योंकि ऑब्जेक्ट की लंबाई विधि नहीं है:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

@palmsey: ओपी के लिए निष्पक्षता में, जावास्क्रिप्ट प्रलेखन वास्तव में स्पष्ट रूप से "साहचर्य सरणियों" के रूप में इस प्रकार की वस्तु के चर का उपयोग करने का उल्लेख करता है।


8
काम नहीं करेगा, क्योंकि यह तरीकों की भी गणना करेगा, जो कि प्रोटोटाइप के माध्यम से जोड़े जाते हैं।
लाजोस मेस्सरोस

30

इस विधि से एक सरणी में आपके सभी ऑब्जेक्ट की संपत्ति के नाम मिलते हैं, इसलिए आप उस सरणी की लंबाई प्राप्त कर सकते हैं जो आपकी ऑब्जेक्ट की लंबाई के बराबर है।

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

@PatrickRoberts कुंजी विधि प्रोटोटाइप श्रृंखला से गुण नहीं लौटाती है। तो क्यों यहाँ hasOwnProperty की आवश्यकता है। इसके अलावा getOwnProperty छिपी हुई संपत्ति लौटाएगी, क्योंकि लंबाई सरणी आदि में है
मुहम्मद उमर

24

प्रोटोटाइप या अन्य कोड के साथ गड़बड़ न करने के लिए, आप अपनी स्वयं की वस्तु का निर्माण और विस्तार कर सकते हैं:

function Hash(){
    var length=0;
    this.add = function(key, val){
         if(this[key] == undefined)
         {
           length++;
         }
         this[key]=val;
    }; 
    this.length = function(){
        return length;
    };
}

myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2

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

बेशक, आप हमेशा तरीकों को अधिलेखित कर सकते हैं। लेकिन अगर आप ऐसा करते हैं, तो भी आपका कोड संभवत: असफल हो जाएगा, जिससे डिबग करना आसान हो जाएगा। ;)


मुझे लगता है कि यह सबसे अच्छा समाधान है क्योंकि इसमें 'फॉर' के साथ लूपिंग की आवश्यकता नहीं है जो कि महंगा हो सकता है यदि सरणी बड़ी हो
Emeka Mbah

20

यहां बताया गया है कि यह जांचना न भूलें कि संपत्ति प्रोटोटाइप श्रृंखला पर नहीं है:

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;

20

बस इसे पाने के लिए इसका उपयोग करें length:

Object.keys(myObject).length

7
कृपया यह बताएं कि आपका उत्तर stackoverflow.com/a/6700/8632727
पटटा

3
तुम भी वास्तव में अपनी वस्तु का नामकरण नहीं करना चाहिएmyArray
बैरी माइकल डॉयल

2
@BarryMichaelDoyle मैंने बदल दिया है कि :)
saurabhgoyal795

अच्छा है, हमेशा अपने चरों को नाम देना बेहतर होता है कि वे वास्तव में क्या हैं। आपके कोड को अन्य देवों के लिए अधिक पठनीय बनाता है।
बैरी माइकल डॉयल

4
"MyArray" -> "myObject" एडिट से पहले, यह दूसरे सबसे ऊंचे उत्तर के समान था।
युनानोश

16

यहां एक पूरी तरह से अलग समाधान है जो केवल अधिक आधुनिक ब्राउज़रों (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 5.1+) में काम करेगा

JsFiddle देखें

अपना सहयोगी सरणी वर्ग सेट करें

/**
 * @constructor
 */
AssociativeArray = function () {};

// Make the length property work
Object.defineProperty(AssociativeArray.prototype, "length", {
    get: function () {
        var count = 0;
        for (var key in this) {
            if (this.hasOwnProperty(key))
                count++;
        }
        return count;
    }
});

अब आप इस कोड का उपयोग इस प्रकार कर सकते हैं ...

var a1 = new AssociativeArray();
a1["prop1"] = "test";
a1["prop2"] = 1234;
a1["prop3"] = "something else";
alert("Length of array is " + a1.length);

मुझे लगता है कि यह सुरक्षित नहीं है। उदाहरण के लिए इसमें "लंबाई" की कुंजी के साथ एक तत्व नहीं हो सकता है, कथन a1 ["लंबाई"] = "हैलो वर्ल्ड"; प्रविष्टि को संग्रहीत करने में विफल। इसके अलावा कथन a1 ["hasOwnProperty"] = "कुछ प्रोप";
टोटल

3
@PanosTheof मुझे नहीं लगता कि आप यह चाहते हैं कि यदि आप lengthसंपत्ति का उपयोग करते हैं तो आप इसे स्टोर कर सकते हैं, इसका इस्तेमाल करने वाले किसी भी कोड को यह सुनिश्चित करना होगा कि यह कोशिश नहीं करता है और इसके खिलाफ स्टोर नहीं करता है length, लेकिन मुझे लगता है कि यह वैसा ही होगा जैसा कि यह था एक मानक सरणी भी। hasOwnPropertyकिसी भी वस्तु पर ओवरराइड करने की संभावना सबसे अधिक अवांछित परिणाम उत्पन्न करेगी।
सहयोगी

16

<script>
myObj = {"key1" : "Hello", "key2" : "Goodbye"};
var size = Object.keys(myObj).length;
console.log(size);
</script>

<p id="myObj">The number of <b>keys</b> in <b>myObj</b> are: <script>document.write(size)</script></p>

यह मेरे लिए काम करता है:

var size = Object.keys(myObj).length;

15

कुछ मामलों के लिए आकार को केवल एक अलग चर में संग्रहीत करना बेहतर होता है। विशेष रूप से, यदि आप एक स्थान पर एक तत्व द्वारा सरणी में जोड़ रहे हैं और आसानी से आकार बढ़ा सकते हैं। यह स्पष्ट रूप से बहुत तेजी से काम करेगा यदि आपको अक्सर आकार की जांच करने की आवश्यकता होती है।



14

@palmsey: ओपी को निष्पक्षता में, जावास्क्रिप्ट डॉक्स वास्तव में स्पष्ट रूप से इस तरह के ऑब्जेक्ट के चर का उपयोग करने के लिए संदर्भित करता है "साहचर्य सरणियों" के रूप में।

और @palmsey के लिए निष्पक्षता में वह काफी सही था, वे साहचर्य सरणियों नहीं हैं, वे निश्चित रूप से वस्तुओं हैं :) - एक साहचर्य सरणी का काम कर रहे हैं। लेकिन जैसा कि व्यापक बिंदु के संबंध में आपको निश्चित रूप से यह ठीक-ठीक लेख के अनुसार लगता है, जो मुझे मिला:

जावास्क्रिप्ट "साहचर्य Arrays" हानिकारक माना जाता है

लेकिन इस सब के अनुसार, स्वीकार किए जाते हैं जवाब ही बुरा अभ्यास नहीं है?

ऑब्जेक्ट के लिए एक प्रोटोटाइप आकार () फ़ंक्शन निर्दिष्ट करें

यदि ऑब्जेक्ट में कुछ और भी जोड़ा गया है।

<script type="text/javascript">
Object.prototype.size = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
Object.prototype.size2 = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>

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


13

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

const myMap = new Map();
myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);
myMap.size; // 3

11

इस तरह के किसी चीज़ के बारे में क्या --

function keyValuePairs() {
    this.length = 0;
    function add(key, value) { this[key] = value; this.length++; }
    function remove(key) { if (this.hasOwnProperty(key)) { delete this[key]; this.length--; }}
}

11

अगर हमारे पास हैश है

हैश = {"ए": "बी", "सी": "डी"};

हम उन लंबाई की लंबाई का उपयोग करके प्राप्त कर सकते हैं जो हैश की लंबाई है:

कुंजी (हैश) .length


2
यह एक महान जवाब है, हालांकि मैं इस कुंजी समारोह के लिए कोई दस्तावेज नहीं पा सकता हूं। इसलिए मैं क्रॉस ब्राउज़र समर्थन पर आश्वस्त नहीं हो सकता।
चिम

1
दुर्भाग्य से, यह उतना अच्छा जवाब नहीं है जितना मैंने पहले सोचा था! यह पता चला है कि कुंजी फ़ंक्शन केवल क्रोम और फ़ायरफ़ॉक्स वेब कंसोल में उपलब्ध है। आप एक स्क्रिप्ट के लिए इस कोड को तो यह Uncaught ReferenceError साथ विफल हो जाएगा: कुंजी परिभाषित नहीं है
चिम


1
यह aeosynth के उत्तर से कैसे भिन्न है ?
पीटर मोर्टेंसन

11
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. Object.values ​​(myObject) .length
  2. Object.entries (myObject) .length
  3. Object.keys (myObject) .length

उपरोक्त 3. में से कौन सा तेज है 3.
सिल्वेरु किरन कुमार

Object.values ​​(myObject) .length
tdjprog

हम यह कैसे कह सकते हैं कि यह Object.values ​​(myObject) है। इसकी गति तेज है, कोई उदाहरण नहीं है, @tdjprog
siluveru kiran kumar

बस इसे कंसोल में आज़माएं:var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
tdjprog

Why Object.values ​​(myObject) .length तेजी से, जहां Object.entries (myObject) के रूप में। कुछ समय बाद भी आउटपुट नहीं दे रहा है। यहां क्या कारण है? धन्यवाद @tdjprog
सिलुवरु किरन कुमार

10

यदि आप AngularJS 1.x का उपयोग कर रहे हैं, तो आप फ़िल्टर बनाकर और निम्न में से किसी भी अन्य उदाहरण से कोड का उपयोग करके AngularJS तरीके से काम कर सकते हैं:

// Count the elements in an object
app.filter('lengthOfObject', function() {
  return function( obj ) {
    var size = 0, key;
    for (key in obj) {
      if (obj.hasOwnProperty(key)) size++;
    }
   return size;
 }
})

प्रयोग

आपके नियंत्रक में:

$scope.filterResult = $filter('lengthOfObject')($scope.object)

या आपके विचार में:

<any ng-expression="object | lengthOfObject"></any>

4
ओपी ने एक एंगुलरजेएस संस्करण के लिए नहीं कहा है। यह सवाल का एक वैध जवाब नहीं है।
फ्रांसिस्को हॉज

10

इसका सबसे सरल तरीका है

Object.keys(myobject).length

जहां myobject वह वस्तु है जो आप लंबाई चाहते हैं


2
यह इस मौजूदा जवाब का सिर्फ एक दोहराव प्रतीत होता है ।
पैंग

@Pang ने सहमति व्यक्त की, और यह अन्य उत्तर की तरह कोई और संदर्भ प्रदान नहीं करता है।
रहस्यमय

8

यदि आप Internet Explorer 8 या निम्न का समर्थन करने के बारे में परवाह नहीं करते हैं, तो आप निम्न दो चरणों को लागू करके किसी ऑब्जेक्ट में गुणों की संख्या आसानी से प्राप्त कर सकते हैं:

  1. या तो Object.keys()एक सरणी प्राप्त करने के लिए चलाएं जिसमें केवल उन गुणों के नाम शामिल हैं जो कि नाममात्र हैं या Object.getOwnPropertyNames()यदि आप उन गुणों के नामों को भी शामिल करना चाहते हैं जो गणना योग्य नहीं हैं।
  2. .lengthउस सरणी की संपत्ति प्राप्त करें ।

यदि आपको इसे एक से अधिक बार करने की आवश्यकता है, तो आप इस तर्क को किसी फ़ंक्शन में लपेट सकते हैं:

function size(obj, enumerablesOnly) {
    return enumerablesOnly === false ?
        Object.getOwnPropertyNames(obj).length :
        Object.keys(obj).length;
}

इस विशेष फ़ंक्शन का उपयोग कैसे करें:

var myObj = Object.create({}, {
    getFoo: {},
    setFoo: {}
});
myObj.Foo = 12;

var myArr = [1,2,5,4,8,15];

console.log(size(myObj));        // Output : 1
console.log(size(myObj, true));  // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr));        // Output : 6
console.log(size(myArr, true));  // Output : 6
console.log(size(myArr, false)); // Output : 7

इस फिडेल को एक डेमो के लिए भी देखें ।


8

Object.keys(myObject).lengthऑब्जेक्ट / सरणी की लंबाई प्राप्त करने के लिए उपयोग करें

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

console.log(Object.keys(myObject).length); //3

8
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

console.log(Object.keys(myObject).length)

// o/p 3

7

उपरोक्त में से कुछ पर एक भिन्नता है:

var objLength = function(obj){    
    var key,len=0;
    for(key in obj){
        len += Number( obj.hasOwnProperty(key) );
    }
    return len;
};

यह hasOwnProp को एकीकृत करने के लिए थोड़ा अधिक सुरुचिपूर्ण तरीका है।


6

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

Object.prototype.size = function () {
    var size = 0,
        key;
    for (key in this) {
        if (this.hasOwnProperty(key)) size++;
    }
    return size;
};

var x = {
    one: 1,
    two: 2,
    three: 3
};

x.size() === 3;

jsfiddle उदाहरण: http://jsfiddle.net/qar4j/1/


6
Object.prototype- बुरा विचार।
दिजाद बोरोवी

@tborychowski आप कृपया समझा सकते हैं क्यों?
मोहम्मद

यहाँ एक लेख है: bit.ly/1droWrG । मैं यह नहीं कह रहा हूं कि ऐसा नहीं किया जाना चाहिए, केवल इससे पहले कि आप ऐसा करने से पहले सभी नतीजों को जान लें।
डिजीड बोरोवी

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

5

आप बस Object.keys(obj).lengthइसकी लंबाई पाने के लिए किसी भी वस्तु पर उपयोग कर सकते हैं । Object.keys एक सरणी देता है जिसमें सभी ऑब्जेक्ट कुंजियाँ (गुण) होती हैं जो संबंधित सरणी की लंबाई का उपयोग करके उस ऑब्जेक्ट की लंबाई खोजने के लिए काम में आ सकती हैं। आप इसके लिए एक फंक्शन भी लिख सकते हैं । आइए रचनात्मक हो जाएं और इसके लिए एक विधि लिखें (साथ ही एक अधिक शालीनता प्राप्त करने वाले की संपत्ति):

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

console.log(objLength({a:1, b:"summit", c:"nonsense"}));

// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(objLength(obj));

// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
   return Object.keys(this).length;
}
console.log(obj.getLength());

// You can also write it as a method, which is more efficient as done so above

Object.defineProperty(Object.prototype, "length", {get:function(){
    return Object.keys(this).length;
}});
console.log(obj.length);

// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()


3
यह aeosynth के उत्तर से कैसे भिन्न है ?
पीटर मोर्टेंसन

यह इसलिए है क्योंकि यह दिखाता है कि इसे एक फ़ंक्शन और वैश्विक ऑब्जेक्ट विधि के रूप में कैसे बनाया जाए (अधिक ऑब्जेक्ट ओरिएंटेड और कुछ प्रकार के एनकैप्सुलेशन का उपयोग करता है); हालांकि aeosynth का जवाब नहीं है।
रहस्यमयी

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

इसके अलावा, एक विधि "अधिक कुशल" कैसे लिख रही है?
user4642212

5

आप हमेशा Object.getOwnPropertyNames(myObject).lengthवही परिणाम प्राप्त करने के लिए कर सकते हैं जो [].lengthसामान्य सरणी के लिए देगा।


1
Object.keys()एक सरणी देता है जिसमें केवल उन्हीं गुणों के नाम शामिल होते हैं जो असंख्य हैं। यदि आप सभी गुणों के साथ एक सरणी चाहते हैं, तो आपको Object.getOwnPropertyNames()इसके बजाय उपयोग करना चाहिए । देखें डेवलपर.
mozilla.org/en/docs/Web/JavaScript/Reference/…

3
यह aeosynth के उत्तर से कैसे भिन्न है ?
पीटर मोर्टेंसन


4

खेल के लिए थोड़ा देर से, लेकिन इसे प्राप्त करने का एक अच्छा तरीका (IE9 + केवल) लंबाई पर एक जादू पाने वाले को परिभाषित करना है:

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

और आप इसे बस ऐसे ही इस्तेमाल कर सकते हैं:

var myObj = { 'key': 'value' };
myObj.length;

दे देंगे 1


1
एक तरफ प्रोटोटाइप संशोधन के खिलाफ तर्क, मेरे पास व्यक्तिगत रूप से कभी भी इसकी वजह से बग नहीं था और मेरे लिए जावास्क्रिप्ट के मजबूत बिंदुओं में से एक है।
मैक्रोमैन

3

नीचे उन लोगों के लिए कॉफ़ीस्क्रिप्ट में जेम्स कॉगलन के उत्तर का एक संस्करण है जिन्होंने सीधे जावास्क्रिप्ट छोड़ दिया है :)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size

1
आप शायद size++ for own key of obj( own keyCoffeeScript में सिंटेक्स शुगर होने) कहना चाहते थे । hasOwnPropertyऑब्जेक्ट से सीधे उपयोग करना खतरनाक है, क्योंकि यह टूट जाता है जब ऑब्जेक्ट में वास्तव में ऐसी संपत्ति होती है।
कोनराड बोरोस्की

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