जवाबों:
आप अपनी वस्तु के गुणों को इस प्रकार देख सकते हैं:
for(var prop in ad) {
if (ad.hasOwnProperty(prop)) {
// handle prop as required
}
}
hasOwnProperty()विधि का उपयोग करना महत्वपूर्ण है , यह निर्धारित करने के लिए कि ऑब्जेक्ट में एक प्रत्यक्ष संपत्ति के रूप में निर्दिष्ट संपत्ति है, और ऑब्जेक्ट के प्रोटोटाइप श्रृंखला से विरासत में नहीं मिला है।
टिप्पणियों से: आप किसी फ़ंक्शन में उस कोड को डाल सकते हैं, और जैसे ही वह टिप्पणी आती है, उस हिस्से तक पहुंचते ही इसे गलत बना देते हैं
प्रदर्शन का परीक्षण
Object.Keys बनाम For..In का परीक्षण किसी भी गुण के लिए परीक्षण करते समय
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/…
Object.defineProperty(obj, 'foo', {enumerable:false, value:'foo'})।
आप किसी 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
}
var str = "MyString"; Object.keys(str);को आज़माता हूं , तो कंसोल प्रत्येक वर्ण के लिए, 0 से 7 तक 8 कुंजी को आउटपुट करता है। या क्या मुझे अब भी इसका जवाब समझ नहीं आ रहा है।
एक साधारण समारोह बनाने के बारे में क्या?
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 अल्फा रिलीज़ पर भी उपलब्ध है।
hasOwnPropertyसंपत्ति को ओवरराइड करती है, तो फ़ंक्शन क्रैश हो सकता है ... मुझे पता है कि मैं थोड़ा पागल हूं ... लेकिन कभी-कभी आपको नहीं पता कि आपके कोड का उपयोग किस तरह के वातावरण में किया जाएगा, लेकिन आप जानते हैं कि आप किस विधि का उपयोग करना चाहते हैं ...
Object.prototype, तो इसके द्वारा गणना नहीं की जाती है for...in। तो isEmptyObject({toString:1})असफल हो जाएगा। यह दुर्भाग्यपूर्ण कारणों से आप नहीं कर सकते हैं में से एक है काफी का उपयोग Objectएक सामान्य प्रयोजन मानचित्रण के रूप में।
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;
};
अधिकांश हालिया ब्राउज़र (और नोड.जेएस) ऑब्जेक्ट.की () का समर्थन करते हैं जो आपके ऑब्जेक्ट शाब्दिक में सभी कुंजियों के साथ एक सरणी देता है ताकि आप निम्नलिखित कार्य कर सकें:
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
यदि आप underscore.js का उपयोग कर रहे हैं तो आप _.isEmpty फ़ंक्शन का उपयोग कर सकते हैं :
var obj = {};
var emptyObject = _.isEmpty(obj);
_.isEmpty([]) // true पहले जांच कर लें: stackoverflow.com/a/22482737/1922747
यदि आप लॉश का उपयोग करने के इच्छुक हैं , तो आप someविधि का उपयोग कर सकते हैं ।
_.some(obj) // returns true or false
इसका छोटा सा jsbin उदाहरण देखें
_.some([1, 2]) // true पहले जांचना सुनिश्चित करें: stackoverflow.com/a/13356338/1922747
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
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]
}
नोट ए: हम यह देखने के लिए जांचते हैं कि क्या डमी ऑब्जेक्ट के सदस्य के पास हमारे परीक्षण ऑब्जेक्ट के सदस्य के समान प्रकार है या नहीं। यदि यह एक विस्तार है, डमीबॉजेक्ट का सदस्य प्रकार "अपरिभाषित" होना चाहिए
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 है और लूप नहीं चलता है या कुछ है और यह पहले के बाद टूट जाता है एक (क्योंकि हम सब चेक कर रहे हैं यदि कोई है ... तो क्यों जारी है?)
जब यह सुनिश्चित हो जाता है कि ऑब्जेक्ट एक उपयोगकर्ता-परिभाषित है, तो यह निर्धारित करने का सबसे आसान तरीका है कि क्या यूडीओ खाली है, निम्नलिखित कोड होगा:
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
पीएस: ब्राउज़र-परिभाषित वस्तुओं पर इसका इस्तेमाल न करें।
आप निम्नलिखित का उपयोग कर सकते हैं:
डबल धमाका !! संपत्ति की खोज
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 में नाम मौजूद है
यहां एक लिंक है जो ऑपरेटर पर अधिक विवरण में जाता है: यह निर्धारित करना कि कोई वस्तु संपत्ति मौजूद है या नहीं
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
इस बारे में कैसा है?
var obj = {},
var isEmpty = !obj;
var hasContent = !!obj