दिलचस्प पोस्ट
किसी विशेष फ़ाइल एक्सटेंशन के लिए Android Intent फ़िल्टर? पायथन और सीटीप्स: डेटा को वापस पाने के लिए एक सूचक के रूप में किसी फ़ंक्शन को एक स्ट्रेट पास करना सीएसएस का उपयोग कस्टम फ़ॉन्ट का उपयोग करना? जीएसएन: एनोटेशन के बिना विशिष्ट क्षेत्रों को सीरियलाइजेशन से बाहर कैसे करें क्या यह मेरे कोड में रेल विकास पर्यावरण के लिए ईएनवी चर सेट करना संभव है? कैसे घटना पर jquery पर एक निर्देश अद्यतन एनजी मॉडल बनाने के लिए? ओरेकल में आंतरिक शामिल होने के साथ अपडेट कथन मैं एक HTTP 414 "अनुरोध यूआरआई बहुत लंबा" त्रुटि कैसे हल करता हूं? Level.FINE लॉगिंग संदेश क्यों नहीं दिखा रहे हैं? EntitySet को अपडेट करने में असमर्थ – क्योंकि इसमें एक परिभाषा है और कोई भी <UpdateFunction> तत्व मौजूद नहीं है बड़ा सेट मिटाने के लिए टाइमटाइम () "ब्रेक" क्यों करता है? रीसाइक्लिंगदृश्य में संपादन सामग्री को सहेजना LINQ कुल एल्गोरिथ्म समझाया Node.js को हरअथ के साथ उपयोग करने के लिए पर्यावरण विशिष्ट विन्यास सेट करना क्या कोई div में शब्द शब्द लपेटने का एक तरीका है?

मैं जावास्क्रिप्ट ऑब्जेक्ट के गुणों को कैसे गणना करूं?

मैं जावास्क्रिप्ट ऑब्जेक्ट के गुणों को कैसे गणना करूं?

मैं वास्तव में सभी परिभाषित चर और उनके मूल्यों को सूचीबद्ध करना चाहता हूं, लेकिन मुझे पता चला है कि एक चर को परिभाषित करने से वास्तव में विंडो ऑब्जेक्ट की संपत्ति बनती है

वेब के समाधान से एकत्रित समाधान "मैं जावास्क्रिप्ट ऑब्जेक्ट के गुणों को कैसे गणना करूं?"

काफी सरल:

for(var propertyName in myObject) { // propertyName is what you want // you can get the value like this: myObject[propertyName] } 

अब, आपको निजी वैरिएबल नहीं मिलेगा क्योंकि वे उपलब्ध नहीं हैं।


संपादित करें: @ बाइटवेप्लाटिपस सही है कि जब तक आप hasOwnProperty() विधि का उपयोग नहीं करते हैं, तो आपको गुण मिलेगा जो कि विरासत में हैं – हालांकि, मुझे पता नहीं है कि ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग से परिचित किसी को भी कम क्यों नहीं मिलेगा! आमतौर पर, कोई ऐसा जो इस को लाता है, इस बारे में डगलस क्रॉकफोर्ड की चेतावनियों के अधीन रहा है, जो अभी भी मुझे थोड़ा सा भ्रमित करता है। फिर, विरासत ओओ भाषाओं का एक सामान्य हिस्सा है और इसलिए यह प्रोटोटाइपिकल होने के बावजूद, जावास्क्रिप्ट का हिस्सा है।

अब, उस ने कहा है कि, hasOwnProperty() फ़िल्टर करने के लिए उपयोगी है, लेकिन हमें एक चेतावनी ध्वनि की आवश्यकता नहीं है जैसे कि विरासत में मिली संपत्तियों में खतरनाक कुछ है

2 संपादित करें: @ बाइट टूप्लैट्यपस उस स्थिति को सामने लाता है जो किसी व्यक्ति को अपने ऑब्जेक्ट्स के गुणों / विधियों को किसी बिंदु पर समय पर बाद में जोड़ देगा, जब आप मूल रूप से अपनी ऑब्जेक्ट्स लिखे (इसके प्रोटोटाइप के माध्यम से) – जबकि यह सत्य है कि यह अप्रत्याशित व्यवहार हो सकता है , मैं व्यक्तिगत तौर पर यह नहीं देखता हूं कि मेरी समस्या पूरी तरह से सिर्फ राय की बात है इसके अलावा, अगर मैं ऐसी चीज़ों में ऐसी चीजों को डिजाइन करता हूं जो मैं अपने ऑब्जेक्ट के निर्माण के दौरान प्रोटोटाइप का उपयोग करता हूं और फिर भी उस कोड को ऑब्जेक्ट के गुणों पर पुनरावृत्त करता हूं और मैं सभी विरासत गुणों को चाहता हूं? मैं hasOwnProperty() उपयोग नहीं करेगा उसके बाद, हम कहते हैं, कोई नया गुण बाद में जोड़ता है। क्या यह मेरी गलती है कि चीजें उस समय बुरी तरह से व्यवहार करती हैं? मुझे ऐसा नहीं लगता। मुझे लगता है कि यही वजह है कि jQuery, एक उदाहरण के रूप में, यह कैसे काम करता है ( jQuery.extend और jQuery.extend माध्यम से) का विस्तार करने के तरीकों को निर्दिष्ट करता है।

एक for..in लूप का उपयोग किसी ऑब्जेक्ट के गुणों की गणना करने के लिए करें, लेकिन सावधान रहें। गणण गुणों को न केवल उस वस्तु के वापस लौटाएगा, जो कि गणना की जा रही है, लेकिन किसी भी अभिभावक वस्तुओं के प्रोटोटाइप से भी।

 var myObject = {foo: 'bar'}; for (var name in myObject) { alert(name); } // results in a single alert of 'foo' Object.prototype.baz = 'quux'; for (var name in myObject) { alert(name); } // results in two alerts, one for 'foo' and one for 'baz' 

अपने गणन में वंशानुगत गुणों को शामिल करने से बचने के लिए, hasOwnProperty() जांच करें:

 for (var name in myObject) { if (myObject.hasOwnProperty(name)) { alert(name); } } 

संपादित करें: मैं जेसनबिंग के बयान से असहमत हूं कि हमें विरासत में मिली संपत्तियों के बारे में चिंता करने की ज़रूरत नहीं है आपको विरासत में मिली संपत्तियों की गणना करने में कोई खतरा नहीं है, जो आप अपेक्षा नहीं कर रहे हैं, क्योंकि यह आपके कोड के व्यवहार को बदल सकता है।

इससे कोई फर्क नहीं पड़ता कि यह समस्या अन्य भाषाओं में मौजूद है या नहीं; तथ्य यह मौजूद है, और जावास्क्रिप्ट विशेष रूप से कमजोर है क्योंकि ऑब्जेक्ट के प्रोटोटाइप के संशोधनों में बाल ऑब्जेक्ट्स को प्रभावित किया जाता है, भले ही तात्कालिकता के बाद संशोधन हो।

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

मानक तरीके से, जो पहले से ही कई बार प्रस्तावित किया गया है:

 for (var name in myObject) { alert(name); } 

हालांकि इंटरनेट एक्सप्लोरर 6, 7 और 8 में जावास्क्रिप्ट दुभाषिया में एक बग है, जिसका असर कुछ चाबियाँ नहीं है। यदि आप इस कोड को चलाते हैं:

 var obj = { toString: 12}; for (var name in obj) { alert(name); } 

अगर IE को छोड़कर सभी ब्राउज़रों में "12" चेतावनी देगा IE बस इस कुंजी को अनदेखा कर देगा प्रभावित प्रमुख मान हैं:

  • isPrototypeOf
  • hasOwnProperty
  • toLocaleString
  • toString
  • valueOf

आईई में वास्तव में सुरक्षित होने के लिए आपको कुछ ऐसा प्रयोग करना होगा:

 for (var key in myObject) { alert(key); } var shadowedKeys = [ "isPrototypeOf", "hasOwnProperty", "toLocaleString", "toString", "valueOf" ]; for (var i=0, a=shadowedKeys, l=a.length; i<l; i++) { if map.hasOwnProperty(a[i])) { alert(a[i]); } } 

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

आधुनिक ब्राउज़रों (ECMAScript 5) में सभी महत्वपूर्ण गुण प्राप्त करने के लिए आप यह कर सकते हैं:

Object.keys (obj) (पुराने ब्राउज़रों पर पिछड़े संगतता के लिए एक स्निपेट प्राप्त करने के लिए लिंक देखें)

या गैर-अमूल्य गुण प्राप्त करने के लिए:

Object.getOwnPropertyNames (obj)

ECMAScript 5 अनुकूलता तालिका देखें

अतिरिक्त जानकारी: एक गणनीय विशेषता क्या है?

मुझे लगता है कि इस मामले का एक उदाहरण मुझे आश्चर्य से पकड़ लिया है:

 var myObject = { name: "Cody", status: "Surprised" }; for (var propertyName in myObject) { document.writeln( propertyName + " : " + myObject[propertyName] ); } 

लेकिन मेरे आश्चर्य की बात है, उत्पादन है

 name : Cody status : Surprised forEach : function (obj, callback) { for (prop in obj) { if (obj.hasOwnProperty(prop) && typeof obj[prop] !== "function") { callback(prop); } } } 

क्यूं कर? पृष्ठ पर एक अन्य स्क्रिप्ट ऑब्जेक्ट प्रोटोटाइप बढ़ा दी है:

 Object.prototype.forEach = function (obj, callback) { for ( prop in obj ) { if ( obj.hasOwnProperty( prop ) && typeof obj[prop] !== "function" ) { callback( prop ); } } }; 
 for (prop in obj) { alert(prop + ' = ' + obj[prop]); } 

मुझे लगता है … for (property in object) { // do stuff } सभी गुणों की सूची देगा, और इसलिए विंडो ऑब्जेक्ट पर सभी विश्व स्तर पर घोषित चर।

सरल जावास्क्रिप्ट कोड:

 for(var propertyName in myObject) { // propertyName is what you want. // You can get the value like this: myObject[propertyName] } 

jQuery:

 jQuery.each(obj, function(key, value) { // key is what you want. // The value is in: value }); 

यदि आप Underscore.js लाइब्रेरी का उपयोग कर रहे हैं, तो आप फ़ंक्शन कुंजियों का उपयोग कर सकते हैं:

 _.keys({one : 1, two : 2, three : 3}); => ["one", "two", "three"] 

ऑब्जेक्ट के गुणों को कैसे गणना करें यह यहां बताया गया है:

 var params = { name: 'myname', age: 'myage' } for (var key in params) { alert(key + "=" + params[key]); } 

पायथन के शब्दकोश में 'कुंजी' विधि है, और वह वास्तव में उपयोगी है मुझे लगता है कि जावास्क्रिप्ट में हम कुछ ऐसा कर सकते हैं:

 function keys(){ var k = []; for(var p in this) { if(this.hasOwnProperty(p)) k.push(p); } return k; } Object.defineProperty(Object.prototype, "keys", { value : keys, enumerable:false }); 

संपादित करें: लेकिन @ कार्लोस-खंडाना का उत्तर बहुत अच्छी तरह से काम करता है मैंने ऑब्जेक्ट की जाँच की है। कुंजी (विंडो), और नतीजा यह है कि मैं क्या चाहता था

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

एक और आसान तकनीक का उपयोग प्रोटोटाइप के ऑब्जेक्ट का उपयोग करना है। टू जेसन () जेएसओएन को ऑब्जेक्ट को सीरियल करना है, जो आपको प्रॉपर्टी नाम और वैल्यू दोनों दिखाएगा।

 var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']}; Object.toJSON(data); //-> '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}' 

http://www.prototypejs.org/api/object/tojson

आप लूप के लिए उपयोग कर सकते हैं

यदि आप चाहते हैं कि कोई सरणी Object.keys (object1) का उपयोग करे

मैं अभी भी जावास्क्रिप्ट में एक शुरुआत कर रहा हूँ, लेकिन मैं एक वस्तु और उसके बच्चों के सभी गुणों को पुन: प्रारंभिक रूप से मुद्रित करने के लिए एक छोटा सा समारोह लिखा था:

 getDescription(object, tabs) { var str = "{\n"; for (var x in object) { str += Array(tabs + 2).join("\t") + x + ": "; if (typeof object[x] === 'object' && object[x]) { str += this.getDescription(object[x], tabs + 1); } else { str += object[x]; } str += "\n"; } str += Array(tabs + 1).join("\t") + "}"; return str; }