मैं एक रिक्त जावास्क्रिप्ट ऑब्जेक्ट के लिए परीक्षण कैसे करूं?


3104

AJAX अनुरोध के बाद, कभी-कभी मेरा आवेदन किसी खाली वस्तु को लौटा सकता है, जैसे:

var a = {};

मैं कैसे जांच सकता हूं कि क्या मामला है?


7
क्या आप JSON.js स्क्रिप्ट का उपयोग करते हैं? या कोई अन्य JSON लाइब्रेरी। तब आप JSON.encode () फ़ंक्शन का उपयोग करके var को स्ट्रिंग में कनवर्ट कर सकते हैं और फिर उसका परीक्षण कर सकते हैं।
Thevs

if( Object.entries(a).length > 0){ //do }
मुहम्मद शहजाद

जवाबों:


5413

ECMA 5+ :

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

ध्यान दें, हालांकि, यह एक अनावश्यक सरणी (वापसी मान keys) बनाता है ।

पूर्व ECMA 5:

function isEmpty(obj) {
  for(var prop in obj) {
    if(obj.hasOwnProperty(prop)) {
      return false;
    }
  }

  return JSON.stringify(obj) === JSON.stringify({});
}

jQuery :

jQuery.isEmptyObject({}); // true

दर्ज करें :

_.isEmpty({}); // true

अंडरस्कोर :

_.isEmpty({}); // true

Hoek

Hoek.deepEqual({}, {}); // true

ExtJS

Ext.Object.isEmpty({}); // true

AngularJS (संस्करण 1)

angular.equals({}, {}); // true

Ramda

R.isEmpty({}); // true

22
यहाँ jQuery और अंडरस्कोर jsperf.com/isempty-vs-isemptyobject/6
मिखाइल

20
Object.keys(new Date()).length === 0; तो यह उत्तर भ्रामक हो सकता है।
cjbarth

6
चीजों को कठोर करने के बजाय आप इस तथ्य का लाभ भी उठा सकते हैं: (new Date()).constructor === Dateया इसके विपरीत ({}).constructor === Object
जॉन नेल्सन

2
angular.equals ({}, {});
जेरेमी ए। वेस्ट

11
Object.keys()नॉन-एनेमरेबल प्रॉपर्टीज या सिंबल की जांच नहीं करता है। आपको उपयोग करने की आवश्यकता है Object.getOwnPropertyNames()और Object.getOwnPropertySymbols()इसके बजाय। साथ ही, Object.getPrototypeOf()ऑब्जेक्ट का प्रोटोटाइप प्राप्त करने का सही तरीका है। obj.constructorआसानी से जाली हो सकता है। उदाहरण: function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
जेसी

862

ऐसा करने का कोई आसान तरीका नहीं है। आपको संपत्तियों पर स्पष्ट रूप से लूप करना होगा:

function isEmpty(obj) {
    for(var prop in obj) {
        if(obj.hasOwnProperty(prop))
            return false;
    }

    return true;
}

यदि ECMAScript 5 समर्थन उपलब्ध है, तो आप Object.keys()इसके बजाय उपयोग कर सकते हैं :

function isEmpty(obj) {
    return Object.keys(obj).length === 0;
}

56
यह ठीक काम करता है, या अधिक बस: फ़ंक्शन isEmpty (ऑब्जेक्ट) {for (var i in object) {वापसी सच; } विवरण झूठा है; }
निकोलस क्रेडीबर्ग

36
इस कार्य में उल्टा नहीं होना चाहिए?
नमटैक्स

25
@ इनामटैक्स: नहीं - फ़ंक्शन का नाम दिया गया है isEmpty(), इसलिए इसे वापस लौटना चाहिए falseयदि इसके पास कोई संपत्ति है
क्रिस्टोफ़

6
खाली ऑब्जेक्ट डिफ़ॉल्ट ऑब्जेक्ट क्लास का विस्तार करेगा, लेकिन यदि ऑब्जेक्ट प्रोटोटाइप को संशोधित किया गया है तो आपका सरलीकृत फ़ंक्शन विफल हो जाएगा: इस पर विचार करें: Object.prototyp.a = 'hi'; var obj = {}; चेतावनी (obj.a); // आउटपुट "हाय" इमीकेट (obj) // रिटर्न फर्जी
वीनस

29
आपको O (n) समय की जटिलता और O (n) स्थान की जटिलता के बाद से दूसरे उदाहरण का उपयोग नहीं करना चाहिए, जबकि पहला O (1) है।
ब्रायन

572

आपमें से जिन लोगों को एक ही समस्या है, लेकिन jQuery का उपयोग करते हैं, आप jQuery.isEmptyObject का उपयोग कर सकते हैं ।


43
अरे! मैं सिर्फ IE 8 मुद्दों को डिबग करने के लिए केवल कुछ घंटे बिता रहा था कि यह jQuery.isEmptyObject था जो समस्या पैदा कर रहा था। यह सही है अगर वस्तु खाली है।
MFD3000

162
यदि प्रश्न jQuery के बारे में बिल्कुल नहीं है, तो आप jQuery सहित उत्तर क्यों देते हैं?
ईरू

47
मुझे इसकी एक पुरानी टिप्पणी पता है, लेकिन मुझे आश्चर्य है कि आपका प्रश्न @ MFD3000 है, क्योंकि मुद्रा कहती है: सही है, यदि वस्तु खाली है (जैसा कि नाम से संकेत मिलता है)
Александр Фишер

21
इस तरह के मूल कार्य के लिए jQuery शामिल नहीं है, जिसे मैं सही उत्तर कहूंगा। यह सच है कि आजकल jQuery लगभग सर्वव्यापी है, लेकिन फिर भी हमें यह नहीं भूलना चाहिए कि यह एक बहुत ही सक्षम भाषा के आसपास बनाया गया है।
पाब्लो मेचर

54
इन टिप्पणियों में विशिष्ट जेएस स्नोबेरी। हर कोई जानता है कि वेब पर जावास्क्रिप्ट का एक बड़ा हिस्सा jQuery पर लिखा गया है, इसलिए यह jQuery के लिए यहां एक समाधान प्रदान करने के लिए पूरी तरह से स्वीकार्य है अगर इसमें पहले से ही वस्तुओं के परीक्षण के लिए एक अंतर्निहित तरीका है। यह संभव है कि मदद की तलाश करने वाले हजारों डेवलपर्स इस उत्तर को उपयोगी पाएंगे। किसी ने नहीं कहा कि यह करने का एकमात्र तरीका है। मैं नोटिस करता हूं कि कोई भी उस व्यक्ति के बारे में सभी अभिजात्य कार्य नहीं करता है जिसने उपयोग करने के लिए एक समाधान पोस्ट किया underscore.js...
BadHorsie

276

यह मेरा पसंदीदा समाधान है:

var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty

1
IE9 BTW के साथ संगतता समस्या। developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
doublejosh

3
@ जेरो फ्रांजानी: नहीं, यह नहीं है
निकोसिप

Object.keys ({})। लंबाई की तुलना में (... के लिए ...) विकल्प की तुलना में 10 गुना धीमी है - मैं इसे एक objetc खाली होने पर परीक्षण करने के तरीके के रूप में बचने का सुझाव देता हूं।
द्वादशीदास

10
Object.keys(new Date()).length === 0; तो यह उत्तर भ्रामक हो सकता है।
cjbarth

new Date()कोई वस्तु नहीं है। nd = new Date(); nd.constructor === Object;में परिणाम false
पोर्स

204

आप Underscore.js का उपयोग कर सकते हैं ।

_.isEmpty({}); // true

19
या आप उपयोग कर सकते हैं लॉश खाली है ( lodash.com/docs#isEmpty ), लेकिन यह कैसे एक jQuery समाधान का उपयोग करने से अलग है - आपको अभी भी एक अतिरिक्त लाइब्रेरी स्थापित करने की आवश्यकता है। मुझे लगता है कि एक वेनिला जावास्क्रिप्ट समाधान का इरादा है।
tfmontague

10
यदि आप Node.js. के साथ बैकेंड पर JS का उपयोग करना चाहते हैं तो यह अलग है कुछ लोग बैकएंड पर jQuery का उपयोग करना चाहेंगे (एक फ्रंट-एंड लाइब्रेरी जो ज्यादातर DOM जोड़तोड़ के लिए उपयोग की जाती है)।
नाहन

3
@tfmontague अंडरस्कोर नोड एप्स पर बहुत ही सामान्य है, लगभग सर्वव्यापी के रूप में jQ क्लाइंट-साइड पर है। मुझे पहले से ही अंडरस्कोर की आवश्यकता थी लेकिन यह महसूस नहीं हुआ कि यह समारोह था
आरडब्ल्यू-नंदेमो

5
अंडरस्कोर को लॉश के साथ बदला जा रहा है। इसके बजाय उसका उपयोग करें।
डेनिक्स

2
केवल दिनांक प्रकारों से सावधान रहें, IsEmpty हमेशा Date के लिए सही रहता है, github.com/jashkenas/underscore/issues/445
23

116
if(Object.getOwnPropertyNames(obj).length === 0){
  //is empty
}

http://bencollier.net/2011/04/javascript-is-an-object-empty/ देखें


5
यदि आप देखभाल करते हैं तो इसमें गैर-एन्यूमरेबल गुण शामिल हैं।

Object.getOwnPropertyNames ({})। लंबाई की तुलना में (... के लिए ...) विकल्प की तुलना में 10 गुना धीमा है - मैं इसे एक objetc खाली होने पर परीक्षण करने के तरीके के रूप में बचने का सुझाव देता हूं।
द्वादशीदास

4
Object.getOwnPropertyNames(new Date()).length === 0; तो यह उत्तर भ्रामक हो सकता है।
cjbarth

80

JSON.stringify का उपयोग कैसे करें? यह सभी आधुनिक ब्राउज़रों में लगभग उपलब्ध है।

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

23
वापसी (JSON.stringify (obj) == '{}')
विक

26
यह इस तरह की उपयोगिता के लिए धीमी और गति है। यहां क्विक परफैक्ट

1
यह एक बहुत ही धीमा विकल्प है - मैं सुझाव देता हूं कि इसके लिए (for ...) विकल्प का उपयोग करें
davidhadas

2
और यह उन वस्तुओं के लिए काम नहीं करता है जिनमें फ़ंक्शन होते हैं।
फेलिक्स क्लिंग

1
यदि ऑब्जेक्ट में एक परिपत्र संदर्भ है, तो यह एक त्रुटि भी फेंक देगा। तो यह धीमा है, अविश्वसनीय है और त्रुटियों को फेंक सकता है और बाकी सब कुछ तोड़ सकता है। इसका उपयोग करने का कोई कारण नहीं।
बुरक

62

मैं बस एक समान स्थिति में भाग गया। मैं JQuery का उपयोग नहीं करना चाहता था, और शुद्ध जावास्क्रिप्ट का उपयोग करके ऐसा करना चाहता था।

और जो मैंने किया, वह निम्नलिखित शर्त का उपयोग करता था, और यह मेरे लिए काम करता था।

var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
   //Code here..
}

उपयोग नहीं के बराबर है: JSON.stringify(obj) !== '{}'

इस JSFiddle बाहर की जाँच करें


4
JSON.stringify के रूप में विशेष रूप से उनके लिए एक अपवाद फेंकता के रूप में परिपत्र संदर्भ के साथ वस्तुओं के लिए असफल हो जाएगा।
पेड्रो मोंटोटो गार्सिया

1
@ PedroMontotoGarcía ठीक है और एक खाली वस्तु का एक गोलाकार संदर्भ कैसे होगा?
21

8
यदि वस्तु खाली नहीं है (और यह उनके लिए भी काम करना चाहिए)।
पेड्रो मोंटोटो गार्सिया

ऐसा लगता है कि @Ateszki द्वारा पहले ही उल्लेख किया गया है और यह जांचने के सबसे धीमे तरीकों में से एक है कि क्या कोई वस्तु खाली नहीं है।
1

अरे हाँ .. मैं इसे याद किया। मैं एक ऐसी स्थिति में भाग गया, जहां मैं इस जावास्क्रिप्ट को प्राप्त करना चाहता था, और थोड़ी सोच-विचार के बाद मैंने इस तरह से पता लगाया। @ एट्सज़की, यहां तक ​​कि यद्यपि आपने जिस तरह से किया था। :-) Btw, इस पर बहुत सारे उत्तर थे, और इसलिए मैंने आपके उत्तर को याद किया।
अनीश नायर

60

पुराना सवाल है, लेकिन सिर्फ मुद्दा था। यदि वस्तु खाली नहीं है तो जांच करना आपका एकमात्र उद्देश्य है JQuery को शामिल करना वास्तव में एक अच्छा विचार नहीं है। इसके बजाय, सिर्फ JQuery के कोड में गहरे , और आपको जवाब मिलेगा:

function isEmptyObject(obj) {
    var name;
    for (name in obj) {
        if (obj.hasOwnProperty(name)) {
            return false;
        }
    }
    return true;
}

5
यह केवल तभी उपयोगी है जब कुछ अन्य प्रक्रिया ने आपके आधार ऑब्जेक्ट में एक प्रोटोटाइप नहीं जोड़ा है। इसे वास्तव में काम करने योग्य बनाने के लिए, आपको obj.hasOwnProperty (नाम) के लिए परीक्षण करने की आवश्यकता है
16:14

1
यह 2009 से क्रिस्टोफ के जवाब के लिए कुछ भी नहीं जोड़ता है।
डैनस्केलस्कु

39

यदि आप एक नए ब्राउज़र पर हैं तो एक सरल तरीका है। Object.keys(obj).length == 0


1
keysसंपत्ति कहां से आती है?

2
यह ECMAScript 5.1 में एक मानक विधि है
डाउनलोड करें

1
उपरोक्त टिप्पणी में 4 उत्थान कैसे हो सकते हैं? हां, Object.keysएक मानक विधि है, लेकिन वस्तुओं में एक कुंजी गुण नहीं है। इसलिए यह कोड किसी भी वस्तु को खाली के रूप में रिपोर्ट करेगा, क्योंकि यह गलती से एक संपत्ति के नाम पर होता है keyजो फिर से एक संपत्ति के रूप में होता है जिसका नाम lengthशून्य नहीं है। भयानक!
स्क्रेवी

Object.keys(new Date()).length === 0; तो यह उत्तर भ्रामक हो सकता है।
cjbarth

11
@ क्रैवी ऑब्जेक्ट क्लास ऑब्जेक्ट है। ऑब्जेक्ट में 'कीज़' नाम की एक स्टैटिक विधि होती है जो ऑब्जेक्ट को एक तर्क के रूप में स्वीकार करती है। यह पद्धति स्ट्रिंग्स की एक सरणी लौटाती है जहाँ स्ट्रिंग्स संपत्ति के नाम हैं। developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Sgnl

33

Object.keys (obj) .length का उपयोग करना (जैसा कि ECMA 5+ के लिए ऊपर बताया गया है) खाली वस्तुओं के लिए 10 गुना धीमा है! पुराने स्कूल (... में) विकल्प के साथ रखें।

नोड, क्रोम, फ़ायरफ़ॉक्स और IE 9 के तहत परीक्षण किया गया, यह स्पष्ट है कि अधिकांश उपयोग के मामलों के लिए:

  • (for ... में ...) का उपयोग करने के लिए सबसे तेज़ विकल्प है!
  • Object.keys (obj) .length खाली वस्तुओं के लिए 10 गुना धीमी होती है
  • JSON.stringify (obj)। गति हमेशा सबसे धीमी होती है ( सुपरराइजिंग नहीं)
  • Object.getOwnPropertyNames (obj) .Length, Object.keys (obj) की तुलना में अधिक समय लेती है । कुछ प्रणालियों पर गति बहुत अधिक लंबी हो सकती है।

निचला रेखा प्रदर्शन बुद्धिमान, उपयोग:

function isEmpty(obj) { 
   for (var x in obj) { return false; }
   return true;
}

या

function isEmpty(obj) {
   for (var x in obj) { if (obj.hasOwnProperty(x))  return false; }
   return true;
}

विस्तृत परीक्षण परिणाम देखें और परीक्षण कोड क्या वस्तु खाली है?


Object.keysधीमा है, लेकिन कम कोड है। एक छोटे पृष्ठ पर, जहां यह कहा जाता है ... शायद 10 बार ... क्या यह अभी भी अतिरिक्त कोड के अतिरिक्त पार्सिंग समय को देखते हुए धीमी होगी?
yankee

33

प्रदर्शन

आज 2020.01.17 मैं क्रोम समाधानों के लिए Chrome v79.0, Safari v13.0.4 और Firefox v72.0 पर MacOs HighSierra 10.13.6 पर परीक्षण करता हूं।

निष्कर्ष

  • for-in(ए, जे, एल, एम) पर आधारित समाधान सबसे तेज़ हैं
  • JSON.stringify(B, K) पर आधारित समाधान धीमे हैं
  • आश्चर्यजनक रूप से भी Object(N) पर आधारित समाधान धीमा है

यहां छवि विवरण दर्ज करें

विवरण

नीचे स्निपेट में 15 समाधान प्रस्तुत किए गए हैं। यदि आप अपने मशीन पर प्रदर्शन परीक्षण चलाना चाहते हैं तो यहां क्लिक करें

यहां छवि विवरण दर्ज करें


इसमें से बहुत कुछ समझ में नहीं आता क्योंकि आप झूठ और या सच की वापसी पर सब कुछ आधारित कर रहे हैं। कभी-कभी प्रोग्रामिंग की आवश्यकता होती है अगर एक बयान या एक टर्नरी ऑपरेटर। बस फीजी
ईसाई मैथ्यू

यह सबसे अच्छा जवाब है, धन्यवाद, पहला समाधान एक आकर्षण की तरह काम करता है
कार्लोस जीसस अरानिसिया तबगोर्गा

32

आप ऑब्जेक्ट कुंजियों की गिनती के लिए जाँच कर सकते हैं:

if (Object.keys(a).length > 0) {
    // not empty
}

8
आप पहले से ही दिए गए उत्तर के लिए एक टिप्पणी क्यों जोड़ेंगे और इससे भी बदतर उत्तर देंगे? stackoverflow.com/a/32108184/4229159 और यह अप्रैल
एलेजांद्रो वेल्स

कैसे अगर मेरे पास एक बहुत बड़ी वस्तु है और प्रत्येक लूप पर यह देखने के लिए कि क्या वस्तु खाली थी?
स्टेफन्सआरी

27
  1. बस एक वर्कअराउंड है। क्या आपका सर्वर बिना डेटा के मामले में कुछ विशेष संपत्ति उत्पन्न कर सकता है?

    उदाहरण के लिए:

    var a = {empty:true};

    फिर आप इसे आसानी से अपने AJAX कॉलबैक कोड में देख सकते हैं।

  2. इसे जांचने का दूसरा तरीका:

    if (a.toSource() === "({})")  // then 'a' is empty

संपादित करें : यदि आप किसी JSON लाइब्रेरी (fe JSON.js) का उपयोग करते हैं तो आप JSON.encode () फ़ंक्शन को आज़मा सकते हैं और परिणाम को रिक्त मान स्ट्रिंग के विरुद्ध परीक्षण कर सकते हैं।


6
toSource()गैर-मानक है और IE या ओपेरा में काम नहीं करता है (और संभावित रूप से अन्य ब्राउज़रों की मैंने जांच नहीं की है)
क्रिस्टोफ़

4
@Thevs: शायद आपके पास ECMA-262 के वर्तमान संस्करण की एक अलग प्रतिलिपि है, लेकिन मेरा toSourceखंड 15.2.4 में एक संपत्ति को सूचीबद्ध नहीं करता है ; MDC के अनुसार, इसे JS1.3 (यानी नेटस्केप नेविगेटर 4.06) में पेश किया गया था, लेकिन यह ECMA-262, 3rd संस्करण में नहीं है!
क्रिस्टोफ

4
@Vs: ठीक है, कम से कम 2 महत्वपूर्ण ब्राउज़र विक्रेताओं ने इसे लागू नहीं किया, इसलिए यह शायद ही एक वास्तविक-मानक है, और जैसा कि ECMA-262 में नहीं है, यह वास्तविक भी नहीं है ...
Christoph

4
जब यह काम करता है, तब भी ऐसा करने toSource()का एक भयानक तरीका है (जैसा है JSON.encode())। यह खाली है अगर यह जाँच करने के लिए अपनी पूरी वस्तु का प्रतिनिधित्व करने के लिए एक स्ट्रिंग बनाने की जरूरत है। चीजों को स्ट्रिंग्स में बदलने का ओवरहेड है, लेकिन इसके अलावा अगर आपकी वस्तु में एक लाख गुण हैं, तो इसे एक लाख चीजों को बदलने की आवश्यकता होगी, जबकि वास्तव में सिर्फ एक को देखने से आपको पता चल जाएगा कि यह खाली नहीं है।
जैस्पर

4
@ यह ओवरहेड बड़ा है, भले ही यह परिमाण के एक ही क्रम में हो सकता है (मुझे यकीन नहीं है कि यह हर परिस्थिति में है)। हालाँकि, उस उत्तर में झूठी वापसी शामिल है जैसे ही एक अलग संपत्ति मिलती है जो कहानी को एक साथ अलग बनाती है ...
जैस्पर

25

यदि ऑब्जेक्ट खाली है, तो यह निर्धारित करने के लिए मैंने एक पूर्ण फ़ंक्शन बनाया है।

यदि संभव हो तो सबसे अच्छा प्रदर्शन ( संगतता तालिका देखें ) और पुराने इंजनों (ब्राउज़रों) के लिए सबसे अधिक अनुकूल दृष्टिकोण के लिए कमियां प्राप्त करने के लिए यह ECMAScript 5 (ES5) कार्यक्षमता Object.keysसे उपयोग करता है ।

समाधान

/**
 * Returns true if specified object has no properties,
 * false otherwise.
 *
 * @param {object} object
 * @returns {boolean}
 */
function isObjectEmpty(object)
{
    if ('object' !== typeof object) {
        throw new Error('Object must be specified.');
    }

    if (null === object) {
        return true;
    }

    if ('undefined' !== Object.keys) {
        // Using ECMAScript 5 feature.
        return (0 === Object.keys(object).length);
    } else {
        // Using legacy compatibility mode.
        for (var key in object) {
            if (object.hasOwnProperty(key)) {
                return false;
            }
        }
        return true;
    }
}

यहाँ इस कोड के लिए Gist है

और यहाँ JSFiddle प्रदर्शन और एक सरल परीक्षण के साथ है।

मुझे उम्मीद है कि यह किसी की मदद करेगा। चीयर्स!


3
यह एक nullवस्तु के लिए विफल रहता है ।

हाय @torazaburo! नोटिस लेने के लिए धन्यवाद! मैंने सही कार्यान्वयन के साथ सभी स्रोतों को अपडेट किया है।
स्लावा फोमिन II

1
Object.keys ({})। लंबाई की तुलना में (... के लिए ...) विकल्प की तुलना में 10 गुना धीमी है - मैं इसे एक objetc खाली होने पर परीक्षण करने के तरीके के रूप में बचने का सुझाव देता हूं।
द्वादशीदास

1
Object.keys(new Date()).length === 0; तो यह उत्तर भ्रामक हो सकता है।
cjbarth

19

मैं इसका उपयोग कर रहा हूं।

function isObjectEmpty(object) {
  var isEmpty = true;
  for (keys in object) {
     isEmpty = false;
     break; // exiting since we found that the object is not empty
  }
  return isEmpty;
}

उदाहरण के लिए:

var myObject = {}; // Object is empty
var isEmpty  = isObjectEmpty(myObject); // will return true;

// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"}; 

// check if the object is empty
isEmpty  = isObjectEmpty(myObject); // will return false;

यहां से

अपडेट करें

या

आप isEmptyObject के jQuery कार्यान्वयन का उपयोग कर सकते हैं

function isEmptyObject(obj) {
  var name;
  for (name in obj) {
    return false;
  }
  return true;
}

नमस्ते। जब आप इस फंक्शन को नंबर या बूलियन ट्रू या गलत रिटर्न के साथ टेस्ट करते हैं और यह सही नहीं है। isObjectEmpty (सही)। isObjectEmpty (गलत)। isObjectEmpty (1)
iman

2
हम जाँच रहे हैं कि वस्तु खाली है या नहीं, यदि डेटा प्रकार एक वस्तु है। आपके मामले में यह जाँचने के लिए कि क्या इसकी कोई वस्तु हमें चाहिए जैसे कि अगर (टाइप ए === "ऑब्जेक्ट") {...}
kiranvj

15

निम्न उदाहरण दिखाता है कि यदि कोई जावास्क्रिप्ट ऑब्जेक्ट खाली है, तो परीक्षण कैसे किया जाए, यदि खाली होने का मतलब है कि इसका कोई गुण नहीं है।

स्क्रिप्ट ES6 पर काम करती है।

const isEmpty = (obj) => {
    if (obj === null ||
        obj === undefined ||
        Array.isArray(obj) ||
        typeof obj !== 'object'
    ) {
        return true;
    }
    return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty(''));           // true
console.log(isEmpty(33));           // true
console.log(isEmpty([]));           // true
console.log(isEmpty({}));           // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello'));      // true
console.log(isEmpty([1, 2, 3]));    // true
console.log(isEmpty({ test: 1 }));  // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date()));   // true
console.log(isEmpty(Infinity));     // true
console.log(isEmpty(null));         // true
console.log(isEmpty(undefined));    // true


14

Object.entries () पर ES2017 विनिर्देशन के अनुसार , चेक किसी भी आधुनिक ब्राउज़र का उपयोग करके सरल है -

Object.entries({}).length === 0

3
इस पर उपयोग करने से कोई लाभ है Object.keysया Object.values?
faintsignal

@faintsignal का उपयोग करने वाले पूरी तरह से ठीक हैं। मैंने सिर्फ प्रविष्टियाँ जोड़ीं जैसा कि टिप्पणियों में नहीं मिला।
विक्रांत

13
function isEmpty(obj) {
  for(var i in obj) { return false; }
  return true;
}

4
यह भी सच है, जब, उदाहरण के लिए, एक जावास्क्रिप्ट पुस्तकालय Objectप्रोटोटाइप श्रृंखला के माध्यम से एक विधि के साथ फैली हुई है , क्योंकि यह गणना योग्य है और यह for inकथन असंख्य गुणों के माध्यम से लूप करता है।
viam0Zah

12

jQuery isEmptyObject()के इस मामले के लिए विशेष कार्य है :

jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false

Http://api.jquery.com/jQuery.isEmptyObject/ पर और पढ़ें


12

अगर यह कम से कम एक कुंजी है मैं जाँच के लिए जाना होगा। मुझे यह बताने के लिए पर्याप्त होगा कि यह खाली नहीं है।

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])

1
क्या होगा यदि पहली कुंजी रिटर्न falseमूल्य? परिणाम falseगलत होगा।
बजे जिमी ओबोनियो अबोर

मैंने उसके लिए परीक्षण किया है। क्या आप एक काम करने का उदाहरण दे सकते हैं?
ट्यूडर मोरार

1
यह संक्षिप्त और संक्षिप्त है, लेकिन यदि परिणाम अपरिभाषित है तो रनटाइम त्रुटि होगी
Mrinmoy

11

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

for(key in obj){
   //your work here.
 break;
}

जो ईएस 5 में विकसित हुआ है , अब बस आप ऑब्जेक्ट की कुंजियों की लंबाई की जांच कर सकते हैं, Object.Keysविधि का उपयोग करके जो आपकी वस्तु को पैरामीटर के रूप में लेता है:

if(Object.keys(obj).length > 0){
 //do your work here
}

या अगर आप लोदाश का उपयोग कर रहे हैं (तो आपको होना चाहिए) तब।

 _.isEmpty(obj) //==true or false

हालांकि, अगर-स्टेटमेंट बनाने के एक अजीब तरीके के रूप में सही है - यह संभवतः किसी को भ्रमित करेगा जो आपके बाद कोड बनाए रखेगा।
सोरेन

10


आप इस सरल कोड का उपयोग कर सकते हैं जो उपयोग नहीं किया था jQuery या अन्य पुस्तकालयों का

var a=({});

//check is an empty object
if(JSON.stringify(a)=='{}') {
    alert('it is empty');
} else {
    alert('it is not empty');
}

JSON वर्ग और यह फ़ंक्शन ( पार्स और स्ट्रिंग ) बहुत उपयोगी हैं लेकिन IE7 के साथ कुछ समस्याएं हैं जो आप इसे इस सरल कोड http://www.json.org/js.html के साथ ठीक कर सकते हैं ।

अन्य सरल तरीका (सबसे सरल तरीका):
आप इस तरह से jQuery या JSON ऑब्जेक्ट का उपयोग किए बिना उपयोग कर सकते हैं ।

var a=({});

function isEmptyObject(obj) {
    if(typeof obj!='object') {
        //it is not object, so is not empty
        return false;
    } else {
        var x,i=0;
        for(x in obj) {
            i++;
        }
        if(i>0) {
            //this object has some properties or methods
            return false;
        } else {
            //this object has not any property or method
            return true;
        }
    }
}

alert(isEmptyObject(a));    //true is alerted

JSON.stringifyसमाधान विफल रहता है यदि ऑब्जेक्ट में गैर-स्ट्रिंग गुण हैं जैसे कि फ़ंक्शन या "अपरिभाषित", हालांकि दी गई है कि यह एक किनारे का मामला है।

10

सबसे अच्छा तरीका जो मैंने पाया:

function isEmpty(obj)
{
    if (!obj)
    {
        return true;
    }

    if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
    {
        return true;
    }

    return false;
}

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

    t1: {} -> true
    t2: {0:1} -: false
    t3: [] -> true
    t4: [2] -> false
    t5: null -> true
    t6: undefined -> true
    t7: "" -> true
    t8: "a" -> false
    t9: 0 -> true
    t10: 1 -> false

3
मैं कहूंगा कि 0 खाली नहीं है क्योंकि यह वास्तव में एक संख्या है। बाकी सब कुछ अच्छा लग रहा है, लेकिन यह तय करना आसान है। पहले अगर कथन इसे जोड़ते हैं। if (!obj && obj !== 0)
mjwrazor

9

मेरा स्वीकार कर लेना:

function isEmpty(obj) {
    return !Object.keys(obj).length > 0;
}

var a = {a:1, b:2}
var b = {}

console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true

बस, मुझे नहीं लगता कि सभी ब्राउज़र Object.keys()वर्तमान में लागू होते हैं।


2
Object.keys(new Date()).length === 0; तो यह उत्तर भ्रामक हो सकता है।
cjbarth

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

9

यदि jQuery और वेब ब्राउज़र उपलब्ध नहीं है, तो underscore.js में एक isEmpty फ़ंक्शन भी है।

_.isEmpty({}) // returns true

इसके अतिरिक्त, यह इनपुट पैरामीटर को ऑब्जेक्ट नहीं मानता है। किसी सूची या स्ट्रिंग या अपरिभाषित के लिए, यह सही उत्तर को भी बदल देगा।



7

चेतावनी! JSON की सीमाओं से सावधान रहें।

javascript:
  obj={  f:function(){}  };
  alert( "Beware!! obj is NOT empty!\n\nobj = {  f:function(){}  }" + 
               "\n\nJSON.stringify( obj )\n\nreturns\n\n" +
                        JSON.stringify( obj ) );

प्रदर्शित करता है

    खबरदार !! obj खाली नहीं है!

    obj = {f: function () {}}

    JSON.stringify (obj)

    रिटर्न

    {}

7

सही जवाब है:

const isEmptyObject = obj =>
  Object.getOwnPropertyNames(obj).length === 0 &&
  Object.getOwnPropertySymbols(obj).length === 0 &&
  Object.getPrototypeOf(obj) === Object.prototype;

यह जाँच करता है कि:

  • ऑब्जेक्ट का अपना कोई गुण नहीं है (पर ध्यान दिए बिना)।
  • वस्तु का अपना कोई संपत्ति प्रतीक नहीं है।
  • ऑब्जेक्ट का प्रोटोटाइप बिल्कुल है Object.prototype

दूसरे शब्दों में, किसी के साथ बनाई गई वस्तु से वस्तु अविभाज्य है {}


6

Thevs जवाब के अलावा:

var o = {};
alert($.toJSON(o)=='{}'); // true

var o = {a:1};
alert($.toJSON(o)=='{}'); // false

यह jquery + jquery.json है


मुझे JSON का उपयोग करना पसंद नहीं है क्योंकि यह परिपत्र ऑब्जेक्ट संरचनाओं के साथ काम नहीं कर सकता है।
itdoesntwork

2
यदि आपका पृष्ठ jQuery लोड करता है $.isEmptyObject(), तो उपयोग करें , गैर-स्पष्ट रूपांतरणों के साथ चक्रों को बर्बाद न करें।
स्काईरपेज

6

Sugar.JS इस उद्देश्य के लिए विस्तारित वस्तुएं प्रदान करता है। कोड साफ और सरल है:

एक विस्तारित वस्तु बनाएं:

a = Object.extended({})

यह आकार की जाँच करें:

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