कैसे चेक करें कि ऑब्जेक्ट में कोई गुण है?


167

मैं घोषित करता हूं

var ad = {}; 

मैं कैसे जांच सकता हूं कि इस ऑब्जेक्ट में कोई उपयोगकर्ता-निर्धारित गुण होंगे?

जवाबों:


86

आप अपनी वस्तु के गुणों को इस प्रकार देख सकते हैं:

for(var prop in ad) {
    if (ad.hasOwnProperty(prop)) {
        // handle prop as required
    }
}

hasOwnProperty()विधि का उपयोग करना महत्वपूर्ण है , यह निर्धारित करने के लिए कि ऑब्जेक्ट में एक प्रत्यक्ष संपत्ति के रूप में निर्दिष्ट संपत्ति है, और ऑब्जेक्ट के प्रोटोटाइप श्रृंखला से विरासत में नहीं मिला है।

संपादित करें

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

प्रदर्शन का परीक्षण

Object.Keys बनाम For..In का परीक्षण किसी भी गुण के लिए परीक्षण करते समय


2
हाय डैनियल, वास्तव में मैं यह जांचने के लिए एक उपकरण की मांग कर रहा हूं कि क्या किसी ऑब्जेक्ट में उपयोगकर्ता-परिभाषित उचितियां हैं या नहीं। यह जांचने के लिए नहीं कि कोई विशिष्ट संपत्ति मौजूद है या नहीं।
रिकी

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

8
मुझे लगता है कि इन दिनों का उपयोग Object.keysकरना सबसे आसान होगा: var a = [1,2,3];a.something=4;console.log(Object.keys(a))क्योंकि यह पहले से ही ECMA 5 का हिस्सा है, आप इसे सुरक्षित रूप से शिम कर सकते हैं: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
HMR

2
ध्यान दें कि ES5 के साथ "इन दिनों", देशी वस्तुओं में गैर-असंख्य गुण हो सकते हैं, जैसे Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'})
RobG

2
यह समाधान मौजूद कुंजियों की जांच करने का एक तरीका है , लेकिन Object.keys (x) .length का उपयोग करके सही, कुशल और सबसे सही उत्तर नीचे दिया गया है। आपको अपना स्वयं का फ़ंक्शन बनाने की आवश्यकता नहीं है, पहले से मौजूद है!
dudewad

193

आप किसी Object.keysविधि पर कुंजियों की सूची प्राप्त करने और उसकी लंबाई का परीक्षण करने के लिए निर्मित विधि का उपयोग कर सकते हैं ।

var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values

if(Object.keys(x).length > 0){
 // Your code here if x has some properties  
}

13
यह यहाँ सही उत्तर है। ऊपर दिया गया स्वीकृत उत्तर एक काम के इर्द-गिर्द है और केवल कुंजियों की संख्या की जाँच करने की तुलना में अधिक महंगा है; यह रास्ता और अधिक समझ में आता है
dudewad

6
Object.keys ( "mystring"); कुंजी के रूप में अच्छी तरह से मुझे लगता है कि अवांछनीय है पैदावार। यह जवाब मेरी राय में अधूरा है।
माइक डे क्लार्क

2
@MikedeKlerk कृपया इसे ध्यान से पढ़ें यह Object.keys ("रहस्य") नहीं है; यह Object.keys (objectVariableName) है जो ऑब्जेक्ट में सभी कुंजियों की सरणी लौटाएगा। ex: {'x': 'abc', 'y': 'def'} यह ['x', 'y' होगा
धवल चौधरी

3
@DhavalChaudhary ने मेरी टिप्पणी के लिए आपके उत्तर के लिए धन्यवाद। जब मैं इस कोड var str = "MyString"; Object.keys(str);को आज़माता हूं , तो कंसोल प्रत्येक वर्ण के लिए, 0 से 7 तक 8 कुंजी को आउटपुट करता है। या क्या मुझे अब भी इसका जवाब समझ नहीं आ रहा है।
माइक डी क्लार्क

6
@MikedeKlerk लेकिन यह केवल उन वस्तुओं के लिए समाधान है जो स्ट्रिंग के लिए नहीं हैं।
धवल चौधरी

111

एक साधारण समारोह बनाने के बारे में क्या?

function isEmptyObject(obj) {
  for(var prop in obj) {
    if (Object.prototype.hasOwnProperty.call(obj, prop)) {
      return false;
    }
  }
  return true;
}

isEmptyObject({}); // true
isEmptyObject({foo:'bar'});  // false

hasOwnPropertyसीधे कॉल करने की विधि Object.prototypeकेवल थोड़ी अधिक सुरक्षा जोड़ने के लिए है , एक सामान्य obj.hasOwnProperty(...)कॉल का उपयोग करके निम्नलिखित की कल्पना करें:

isEmptyObject({hasOwnProperty:'boom'});  // false

नोट: (भविष्य के लिए) उपरोक्त विधि for...inकथन पर निर्भर करती है , और यह कथन केवल गणना करने योग्य गुणों पर निर्भर करता है , वर्तमान में सबसे व्यापक रूप से कार्यान्वित किए जाने वाले ECMAScript Standard (3rd संस्करण) में प्रोग्रामर के पास गैर-असंख्य गुण बनाने का कोई तरीका नहीं है। ।

हालाँकि यह अब ECMAScript 5 वें संस्करण के साथ बदल गया है , और हम गैर-एन्यूमरेबल, गैर-लिखने योग्य या गैर-हटाने योग्य गुण बनाने में सक्षम हैं, इसलिए उपरोक्त विधि विफल हो सकती है , जैसे:

var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal', 
  enumerable: false,
  writable: true,
  configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!

इस समस्या का एक ECMAScript 5 समाधान होगा:

function isEmptyObject(obj) {
  return Object.getOwnPropertyNames(obj).length === 0;
}

Object.getOwnPropertyNamesविधि रिटर्न एक Arrayके नामों वाले सभी खुद गुण एक वस्तु, के गणनीय या नहीं , इस विधि ब्राउज़र विक्रेताओं द्वारा अब लागू किया जा रहा है, यह पहले से ही क्रोम 5 बीटा और नवीनतम वेबकिट रात बनाता है पर है।

Object.defineProperty उन ब्राउज़रों और नवीनतम फ़ायरफ़ॉक्स 3.7 अल्फा रिलीज़ पर भी उपलब्ध है।


1
Obj.hasOwnProperty (प्रोप) पर object.prototype.hasOwnProperty.call (obj, Prop) का क्या फायदा है?
केसी चू

3
@ कैसी, संपादित, यदि कोई वस्तु hasOwnPropertyसंपत्ति को ओवरराइड करती है, तो फ़ंक्शन क्रैश हो सकता है ... मुझे पता है कि मैं थोड़ा पागल हूं ... लेकिन कभी-कभी आपको नहीं पता कि आपके कोड का उपयोग किस तरह के वातावरण में किया जाएगा, लेकिन आप जानते हैं कि आप किस विधि का उपयोग करना चाहते हैं ...
सीएमएस

2
इस सवाल का जवाब देने के लिए +1 ... और भविष्य के अन्य प्रश्न! :)
डैनियल वैसलो

1
ध्यान दें कि IE में एक बग भी है जहां अगर आपके पास एक नाम के साथ एक संपत्ति है जो एक गैर-असंख्य संपत्ति से मेल खाती है Object.prototype, तो इसके द्वारा गणना नहीं की जाती है for...in। तो isEmptyObject({toString:1})असफल हो जाएगा। यह दुर्भाग्यपूर्ण कारणों से आप नहीं कर सकते हैं में से एक है काफी का उपयोग Objectएक सामान्य प्रयोजन मानचित्रण के रूप में।
बोबिन्स

1
@ MichaelMartin-Smucker- कुंजियाँ केवल पर्याप्त गुण प्रदान करती हैं, इसलिए यहां उपयुक्त नहीं है।
RobG

58

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

$.isEmptyObject(obj); // Returns: Boolean

JQuery 1.4 के रूप में यह विधि ऑब्जेक्ट पर दोनों गुणों की जांच करती है और प्रोटोटाइप से विरासत में मिली संपत्तियां (इसमें वह hasOwnProperty का उपयोग नहीं करती है)।

आधुनिक ब्राउज़र में ECMAScript 5 वें संस्करण के साथ (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) आप बिल्ट इन ऑब्जेक्ट.की विधि का उपयोग कर सकते हैं :

var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;

या सादे पुराने जावास्क्रिप्ट:

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

33

अधिकांश हालिया ब्राउज़र (और नोड.जेएस) ऑब्जेक्ट.की () का समर्थन करते हैं जो आपके ऑब्जेक्ट शाब्दिक में सभी कुंजियों के साथ एक सरणी देता है ताकि आप निम्नलिखित कार्य कर सकें:

var ad = {}; 
Object.keys(ad).length;//this will be 0 in this case

ब्राउज़र समर्थन: फ़ायरफ़ॉक्स 4, क्रोम 5, इंटरनेट एक्सप्लोरर 9, ओपेरा 12, सफारी 5

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys


13

यदि आप underscore.js का उपयोग कर रहे हैं तो आप _.isEmpty फ़ंक्शन का उपयोग कर सकते हैं :

var obj = {};
var emptyObject = _.isEmpty(obj);

1
किसी के पास से गुजरने के लिए, यह वस्तुओं के लिए समर्पित एक विधि नहीं है। _.isEmpty([]) // true पहले जांच कर लें: stackoverflow.com/a/22482737/1922747
djv

11

यदि आप लॉश का उपयोग करने के इच्छुक हैं , तो आप someविधि का उपयोग कर सकते हैं ।

_.some(obj) // returns true or false

इसका छोटा सा jsbin उदाहरण देखें


var x = [१,२] // सच
djv

@damionjn मैंने अपने कोड को उदाहरण में जोड़ा। मैं आपकी बात को गलत उत्तर देने वाले सरणी के साथ देखता हूं, लेकिन ओपी ने शुरू में एक चर को एक वस्तु के रूप में घोषित किया, इसलिए मुझे लगता है कि यह मान लेना ठीक है। ऊपर एक उत्तर है जो अंडरस्कोर का उपयोग करता है ईमप्टी विधि (एक ही विधि है) उस उत्तर में ठीक यही मुद्दा है। यदि आप एक गैर खाली सरणी देते हैं तो आपको गलत परिणाम भी मिलेगा।
sfs

पर्याप्त रूप से उचित, लेकिन हमें सर्वोत्तम प्रथाओं के बारे में सुनिश्चित करने के लिए सभी आधारों के साथ उत्तर प्रदान करने चाहिए। आप सही हैं, मैं बिना किसी आलोचना के उनके जवाब से सही हो गया। किसी के पास से गुजरने के लिए, यह वस्तुओं के लिए समर्पित एक विधि नहीं है। _.some([1, 2]) // true पहले जांचना सुनिश्चित करें: stackoverflow.com/a/13356338/1922747
djv

5
for (var hasProperties in ad) break;
if (hasProperties)
    ... // ad has properties

यदि आपको सुरक्षित होना है और ऑब्जेक्ट प्रोटोटाइप के लिए जांचना है (ये कुछ पुस्तकालयों द्वारा जोड़े गए हैं और डिफ़ॉल्ट रूप से वहां नहीं हैं):

var hasProperties = false;
for (var x in ad) {
    if (ad.hasOwnProperty(x)) {
        hasProperties = true;
        break;
    }
}
if (hasProperties)
    ... // ad has properties

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

आपको किसी ऑब्जेक्ट के प्रोटोटाइप का विस्तार करने के लिए एक पुस्तकालय का उपयोग करने या अनुभवहीन होने की आवश्यकता नहीं है। कुछ अनुभवी प्रोग्रामर हर समय ऐसा करते हैं।
अलसीकेंडे

2
for(var memberName in ad)
{
  //Member Name: memberName
  //Member Value: ad[memberName]
}

मेंबर का मतलब मेंबर प्रॉपर्टी, मेंबर वेरिएबल, जिसे आप इसे कॉल करना चाहते हैं> _>

उपरोक्त कोड EVERYTHING को लौटाएगा, जिसमें String शामिल है ... यदि आप केवल यह देखना चाहते हैं कि ऑब्जेक्ट का प्रोटोटाइप बन गया है या नहीं:

var dummyObj = {};  
for(var memberName in ad)
{
  if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
  //Member Name: memberName
  //Member Value: ad[memberName]

}

नोट ए: हम यह देखने के लिए जांचते हैं कि क्या डमी ऑब्जेक्ट के सदस्य के पास हमारे परीक्षण ऑब्जेक्ट के सदस्य के समान प्रकार है या नहीं। यदि यह एक विस्तार है, डमीबॉजेक्ट का सदस्य प्रकार "अपरिभाषित" होना चाहिए


नमस्ते, क्या मैं सिर्फ यह जान सकता हूं कि किसी वस्तु में गुण हैं या नहीं? धन्यवाद
रिकी

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

इस पृष्ठ पर डेनियल समाधान देखें - इसकी कम त्रुटि-प्रवणता!
जोशा

2
आपका पहला कोड ब्लॉक इसे बिल्कुल कवर नहीं करता है। दूसरा कोड ब्लॉक दुर्व्यवहार करता है यदि मैं "विज्ञापन" ऑब्जेक्ट में एक चर जोड़ता हूं जो अपरिभाषित है। वास्तव में, डेनियल उत्तर की जांच करें, यह एकमात्र सही और तेज़ है, क्योंकि यह "hasOwnProbleble" नामक एक देशी कार्यान्वयन का उपयोग करता है।
जोशा 6

@ रेकी: यदि आप जांचना चाहते हैं कि किसी वस्तु में गुण हैं या नहीं, तो आप केवल मेरे उत्तर में उदाहरण का उपयोग कर सकते हैं: stackoverflow.com/questions/2673121/… । यदि कोड टिप्पणी तक पहुंचता है, तो आपकी वस्तु में कोई प्रत्यक्ष गुण नहीं होगा। यदि नहीं, यह होगा।
डैनियल वैसलो

2
var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; }
// as of this line hasAnyProps will show Boolean whether or not any iterable props exist

सरल, हर ब्राउज़र में काम करता है, और भले ही यह तकनीकी रूप से ऑब्जेक्ट पर सभी कुंजियों के लिए एक लूप है जो उन सभी के माध्यम से लूप नहीं करता है ... या तो 0 है और लूप नहीं चलता है या कुछ है और यह पहले के बाद टूट जाता है एक (क्योंकि हम सब चेक कर रहे हैं यदि कोई है ... तो क्यों जारी है?)


1

बहुत देर से जवाब, लेकिन यह है कि आप इसे प्रोटोटाइप के साथ कैसे संभाल सकते हैं।

Array.prototype.Any = function(func) {
    return this.some(func || function(x) { return x });
}

Object.prototype.IsAny = function() {
    return Object.keys(this).Any();
}

0

जब यह सुनिश्चित हो जाता है कि ऑब्जेक्ट एक उपयोगकर्ता-परिभाषित है, तो यह निर्धारित करने का सबसे आसान तरीका है कि क्या यूडीओ खाली है, निम्नलिखित कोड होगा:

isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};

भले ही यह विधि (स्वभाव से) एक डिडक्टिव है, - यह सबसे तेज, और सबसे तेज संभव है।

a={};
isEmpty(a) >> true

a.b=1
isEmpty(a) >> false 

पीएस: ब्राउज़र-परिभाषित वस्तुओं पर इसका इस्तेमाल न करें।


... वापसी 0; वापसी 1}; वही होगा?
आमपाइक

1
@ पाइक न, रिटर्न! १; रिटर्न! ० रिटर्न फर्जी के समान है; वापसी सच
क्रिस्टोफ

0

देर से जवाब, लेकिन कुछ चौखटे वस्तुओं को गणना के रूप में संभालते हैं इसलिए, bob.js इसे इस तरह कर सकते हैं:

var objToTest = {};
var propertyCount = bob.collections.extend(objToTest).count();

0

आप निम्नलिखित का उपयोग कर सकते हैं:

डबल धमाका !! संपत्ति की खोज

var a = !![]; // true
var a = !!null; // false

hasOwnProperty यह एक ऐसी चीज है जिसका मैं उपयोग करता था:

var myObject = {
  name: 'John',
  address: null
};
if (myObject.hasOwnProperty('address')) { // true
  // do something if it exists.
}

हालांकि, जावास्क्रिप्ट ने विधि के नाम की रक्षा नहीं करने का फैसला किया, इसलिए इसके साथ छेड़छाड़ की जा सकती है।

var myObject = {
  hasOwnProperty: 'I will populate it myself!'
};

myObject में प्रोप

var myObject = {
  name: 'John',
  address: null,
  developer: false
};
'developer' in myObject; // true, remember it's looking for exists, not value.

प्रकार का

if (typeof myObject.name !== 'undefined') {
  // do something
}

हालांकि, यह अशक्त के लिए जाँच नहीं करता है।

मुझे लगता है कि यह सबसे अच्छा तरीका है।

ऑपरेटर में

var myObject = {
  name: 'John',
  address: null
};

if('name' in myObject) {
  console.log("Name exists in myObject");
}else{
  console.log("Name does not exist in myObject");
}

परिणाम:

MyObject में नाम मौजूद है

यहां एक लिंक है जो ऑपरेटर पर अधिक विवरण में जाता है: यह निर्धारित करना कि कोई वस्तु संपत्ति मौजूद है या नहीं


0

ES6 फ़ंक्शन

/**
 * Returns true if an object is empty.
 * @param  {*} obj the object to test
 * @return {boolean} returns true if object is empty, otherwise returns false
 */
const pureObjectIsEmpty = obj => obj && obj.constructor === Object && Object.keys(obj).length === 0

उदाहरण:


let obj = "this is an object with String constructor"
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = {}
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = []
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = [{prop:"value"}]
console.log(pureObjectIsEmpty(obj)) // empty? true

obj = {prop:"value"}
console.log(pureObjectIsEmpty(obj)) // empty? false

-1

इस बारे में कैसा है?

var obj = {},
var isEmpty = !obj;
var hasContent = !!obj

यह उत्तर प्रश्न का उत्तर नहीं देता है। ओपी पूछ रहा है कि क्या किसी ऑब्जेक्ट में उपयोगकर्ता-परिभाषित गुण हैं - आपका उत्तर जांचता है कि क्या वस्तु स्वयं एक बूलियन गलत मान में बदल जाएगी।
जसमीत

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