javascript - ऑब्जेक्ट प्रॉपर्टी तक नहीं पहुंच सकता है, भले ही यह मौजूद है। अपरिभाषित रिटर्न




console.log (17)

2018 में मोज़िला हमें यहां मोज़िला डॉक्स में चेतावनी देता है!

मैं "लॉगिंग ऑब्जेक्ट्स" उद्धृत करता हूं:

console.log(obj); उपयोग न करें console.log(obj); , console.log(JSON.parse(JSON.stringify(obj))); उपयोग करें console.log(JSON.parse(JSON.stringify(obj)));

इस तरह आप सुनिश्चित हैं कि आप इसे लॉग इन करने के समय ओबीजे के मूल्य को देख रहे हैं।

यह मुझे परेशान कर रहा है। मुझे नहीं पता कि यह कैसे और समझाना है, लेकिन यहां मेरा डीबग कोड कैसा दिखता है। इसके नीचे आप इन दो लॉगों से आउटपुट देख सकते हैं। पहला स्पष्ट रूप से उस संपत्ति के साथ पूर्ण जावास्क्रिप्ट ऑब्जेक्ट दिखाता है जिसे मैं एक्सेस करने का प्रयास कर रहा हूं, लेकिन अगली पंक्ति कोड मैं इसे config.col_id_3 के साथ एक्सेस नहीं कर सकता (स्क्रीनशॉट में "अपरिभाषित" देखें?)। क्या कोई इसे समझा सकता है? मैं field_id_4 को छोड़कर हर दूसरी संपत्ति तक पहुंच प्राप्त कर सकता हूं।

console.log(config);
console.log(config.col_id_3);

कंसोल में ये console.log () s प्रिंट है


अगर किसी के लिए यह मददगार है, तो मुझे एक ही समस्या थी, और ऐसा इसलिए है क्योंकि किसी ने उस ऑब्जेक्ट में .toJSON के लिए ओवरराइड बनाया था जिसके साथ मैं काम कर रहा था। तो वस्तु कुछ ऐसा था:

{
  foo: {
         bar: "Hello"
         baz: "World"
       }
}

लेकिन .toJSON () था:

toJSON() {
  return this.foo
}

तो जब मैंने JSON.stringify (myObject) कहा तो यह "{" बार ":" हैलो "," बाज़ ":" वर्ल्ड "}" लौटा। हालांकि, ऑब्जेक्ट.कीज़ (myObject) ने "foo" का खुलासा किया।


एजेक्स कॉल करने वाले फ़ंक्शन के साथ काम करते समय मुझे यह वही समस्या थी। मेरे मामले में मुझे सर्वर से वैध त्रुटि कोड प्राप्त करने में समस्या हो रही थी। यह कार्य है:

function getListItem(listItemUri){
    return jQuery.ajax({
        url: listItemUri,
        type: "Get",
        headers: { "accept": "application/json;odata=verbose" }
    });
}

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

var list = getListItem(uri);
var failed = list.fail(onerror);
console.log(failed);  //displays object which included a status
console.log(obj.status); //but when trying to retrieve the status message it was undefined

नीचे दिए गए कोड ने मुझे ऑब्जेक्ट में मानों तक पहुंचने की अनुमति दी है। कुंजी एक चर के रूप में निर्दिष्ट करने के बजाय एक समारोह के रूप में list.fail का उपयोग करने में था।

var list = getListItem(uri);

list.fail(function(obj){
    console.log(obj); //displays object
    console.log(obj.status); //the object is now defined and I am able to see the error code returned by the server
});

कॉन्फ़िगर [0] या कॉन्फ़िगर [0] .col_id_3 के साथ आज़माएं

मुझे बस यह समस्या भी थी, मैं इसे ऑब्जेक्ट देखने में सक्षम था, इसे लॉग करने के लिए, लेकिन कोड से इसे एक्सेस करने के लिए नहीं। मैंने इसके सामने एक [0] जोड़ने की कोशिश की और मेरी समस्या हल कर दी। मैं तब सभी संपत्तियों तक पहुंच सकता था।


जिस संपत्ति को आप एक्सेस करने का प्रयास कर रहे हैं वह अभी तक मौजूद नहीं है। Console.log काम करता है क्योंकि यह एक छोटी देरी के बाद निष्पादित करता है, लेकिन यह आपके शेष कोड के लिए मामला नहीं है। इसे इस्तेमाल करे:

var a = config.col_id_3;    //undefined

setTimeout(function()
{
    var a = config.col_id_3;    //voila!

}, 100);

मुझे आज भी यही समस्या का सामना करना पड़ा। मेरे मामले में चाबियाँ घोंसला थीं, यानी key1.key2। मैंने विभाजन () का उपयोग करके चाबियाँ विभाजित की और फिर स्क्वायर ब्रैकेट नोटेशन का उपयोग किया, जिसने मेरे लिए काम किया।

var data = {
    key1: {
          key2: "some value"
       }
}

मैंने चाबियाँ विभाजित की और इसे इस तरह इस्तेमाल किया, डेटा [key1] [key2] जिसने मेरे लिए काम किया।


मुझे इस तरह का कोई मुद्दा था, और पाया कि समाधान Underscore.js के साथ करना था। मेरा प्रारंभिक लॉगिंग कोई समझ नहीं आया:

console.log(JSON.stringify(obj, null, 2));

> {
>   "code": "foo"
> }

console.log(obj.code);

> undefined

मुझे ऑब्जेक्ट की चाबियाँ भी देखकर समाधान मिला:

console.log(JSON.stringify(Object.keys(obj)));

> ["_wrapped","_chain"]

इससे मुझे एहसास हुआ कि obj वास्तव में एक ऑब्जेक्ट के आसपास अंडरस्कोर.जेएस रैपर था, और प्रारंभिक डिबगिंग मुझे झूठ बोल रही थी।


मुझे इसी तरह की समस्या थी (जब SugarCRM के लिए विकास होता है), जहां से मैं शुरू करता हूं:

var leadBean = app.data.createBean('Leads', {id: this.model.attributes.parent_id});

// This should load object with attributes 
leadBean.fetch();

// Here were my attributes filled in with proper values including name
console.log(leadBean);

// Printed "undefined"
console.log(leadBean.attributes.name);

समस्या fetch() , इसकी async कॉल इसलिए मुझे अपना कोड फिर से लिखना पड़ा:

var leadBean = app.data.createBean('Leads', {id: this.model.attributes.parent_id});

// This should load object with attributes 
leadBean.fetch({
    success: function (lead) {
        // Printed my value correctly
        console.log(lead.attributes.name);
    }
});

मेरा डेटा सिर्फ जेसन डेटा स्ट्रिंग था। (यह चर सत्र में जेसन स्ट्रिंग के रूप में संग्रहीत किया गया था)।

console.log(json_string_object)

-> केवल इस स्ट्रिंग का प्रतिनिधित्व देता है और स्ट्रिंग या ऑब्जेक्ट में अंतर बनाने का कोई तरीका नहीं है।

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

object = JSON.parse(json_string_object);

मेरी भी यही समस्या थी। मेरे लिए समाधान JSON को पार्स करने के लिए इनपुट के रूप में स्ट्रिंग आउटपुट का उपयोग कर रहा था। यह मेरे लिए काम किया। आशा है कि यह आपके लिए उपयोगी होगा

var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);

मेरे पास एक ही समस्या थी और मेरे ऊपर कोई समाधान नहीं था और उसके बाद अनुमान लगाया गया था। हालांकि, मेरे कोड को लपेटकर जो setTimeout फ़ंक्शन में ऑब्जेक्ट बनाता है, मेरे लिए चाल है।

setTimeout(function() {
   var myObj = xyz; //some code for creation of complex object like above
   console.log(myObj); // this works
   console.log(myObj.propertyName); // this works too
});

मेरे मामले में मैं एक वादे के लिए एक वस्तु पारित कर रहा था, वादे के भीतर मैं वस्तु के लिए अधिक महत्वपूर्ण / मूल्य जोड़ रहा था और जब यह किया गया तो वादा वस्तु वापस कर दिया।

हालांकि, मेरे हिस्से पर थोड़ा सा नजर डालने के बाद, वादा पूरी तरह समाप्त होने से पहले ऑब्जेक्ट को वापस कर रहा था ... इस प्रकार मेरा बाकी कोड अद्यतन ऑब्जेक्ट को संसाधित करने की कोशिश कर रहा था और डेटा अभी तक नहीं था। लेकिन ऊपर की तरह, कंसोल में, मैंने ऑब्जेक्ट को पूरी तरह से अपडेट किया लेकिन चाबियों तक पहुंचने में सक्षम नहीं था - वे वापस अपरिभाषित हो रहे थे। जब तक मैंने यह देखा नहीं:

console.log(obj) ;
console.log(obj.newKey1) ;

// returned in console
> Object { origKey1: "blah", origKey2: "blah blah"} [i]
    origKey1: "blah"
    origKey2: "blah blah"
    newKey1: "this info"
    newKey2: "that info"
    newKey3: " more info"
> *undefined*

[I] एक छोटा आइकन है, जब मैंने इसे घुमाया तो यह कहा गया कि Object value at left was snapshotted when logged, value below was evaluated just now । यह तब हुआ जब मेरे साथ यह हुआ कि वादे पूरी तरह से इसे अद्यतन करने से पहले मेरी वस्तु का मूल्यांकन किया जा रहा था।


मैंने आज इस मुद्दे से संघर्ष किया, और सोचा कि मैं अपने समाधान के साथ एक जवाब छोड़ दूंगा।

मैं AJAX के माध्यम से डेटा ऑब्जेक्ट ला रहा था, इस तरह कुछ: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

आइए मान लें कि यह ऑब्जेक्ट डेटा नामक चर में है। जब भी मैंने data.i18n संदर्भित किया। data.i18n मुझे undefined मिला।

  1. console.log(data) ने वस्तु को अपेक्षित रूप से दिखाया
  2. console.log(Object.keys(data)) ने कहा ["constants","i18n"] अपेक्षित के रूप में
  3. अंतर करने के लिए i18n का नाम बदलने से कुछ भी नहीं बदला
  4. मैंने पहली वस्तु को "i18n" बनाने के लिए डेटा को स्विच करने का भी प्रयास किया
  5. ऑब्जेक्ट पूरी तरह से सेट किया गया था और AJAX वादे के साथ कोई समस्या नहीं थी पूरी तरह से सुनिश्चित करने के लिए चारों ओर कोड हटाया।

कुछ भी मदद नहीं की ... फिर सर्वर की तरफ मैंने डेटा को PHP लॉग में लिखा, और यह पता चला:

{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}

इंडेक्स कुंजी में "i" वास्तव में एक u0456 (साइरिलिक i) था। यह मेरे PHP संपादक या ब्राउज़र कंसोल लॉग में दिखाई नहीं दे रहा था। केवल php लॉग ने यह खुलासा किया ... यह एक मुश्किल था ...


मोंगोस का उपयोग करके मोंगोडीबी से लोड किए गए दस्तावेज़ के साथ मुझे यह समस्या मिली है।

पूरे ऑब्जेक्ट पर console.log() चलाते समय, सभी दस्तावेज़ फ़ील्ड (जैसा कि डीबी में संग्रहीत) दिखाया जाएगा। हालांकि कुछ व्यक्तिगत संपत्ति _id undefined वापस आ जाएंगे, जब अन्य ( _id सहित) ठीक काम करेंगे।

यह पता चला कि संपत्ति JSON.stringify() केवल मेरे mongoose.Schema(...) परिभाषा में निर्दिष्ट फ़ील्ड के लिए काम करता है, जबकि console.log() और JSON.stringify() डीबी में संग्रहीत सभी फ़ील्ड लौटाता है।

समाधान (यदि आप मोंगोस का उपयोग कर रहे हैं) : सुनिश्चित करें कि आपके सभी डीबी फ़ील्ड को mongoose.Schema(...) में परिभाषित किया गया है। mongoose.Schema(...)


यह किसी की मदद कर सकता है क्योंकि मेरे पास एक समान समस्या थी जिसमें JSON.parse () एक ऑब्जेक्ट लौटा रहा था जिसे मैं console.log () पर प्रिंट कर सकता था लेकिन मैं विशिष्ट फ़ील्ड को स्वीकार नहीं कर सका और उपर्युक्त समाधान में से कोई भी काम नहीं करता मुझे। JSON.parringify () के साथ JSON.parse () के संयोजन का उपयोग करना।

var jsonObj = JSON.parse(JSON.stringify(responseText))

// where responseText is a JSON String returned by the server.

console.log(jsonObj) ///Was printing the object correctly
console.log(jsonObj.Body) /// Was printing Undefined  

मैं ExtJs Ext.decode () द्वारा प्रदान किए गए एक अलग पार्सर का उपयोग करके समस्या को हल करना समाप्त कर दिया;

var jsonObj = Ext.decode(responseText)
console.log(jsonObj.Body) //Worked...

यहां उत्कृष्ट सुझाव। मैं इसे जोड़ सकता हूं क्योंकि कोई इसे उपयोगी पा सकता है।

ब्राउज़र में या दूरस्थ रूप से कैशिंग के बारे में बहुत जागरूक रहें।

मैं इसके साथ संघर्ष कर रहा था, क्योंकि मैं ऑनलाइन विकास कर रहा हूं, और एक सरल रणनीति लागू की।

  1. मैंने अपने जेएस स्क्रिप्ट के ब्राउजर लोड पर एंटी-कैशिंग लगाई। उद्धरण: "कैशिंग को रोकने के लिए सभी क्वेरी .css और .js फ़ाइलों के लिए एक क्वेरी स्ट्रिंग"? v = 1 "संलग्न करें।"
  2. मैंने एक अतिरिक्त कंसोल लॉग लगाया है जिसे मैं एक नया अनुरोध करने से पहले संशोधित करता हूं: console.log (""); अगर मुझे कंसोल में यह नया लॉग नहीं दिखाई देता है, तो मुझे पता है कि मेरे पास कहीं कैश समस्या है।

एक बार जब मुझे वाक्यविन्यास सही हो गया, तो मैंने पहले सुझाए गए विलंब को हटा दिया है, और सब अच्छा है। मेरे लिए मुझे उपयोग करना पड़ा, "JSON.stringify ("


config = JSON.parse(config);

मेरे पास वही था, डेटा एक पाठ था, न कि जेएसओएन जैसा कि मैं उम्मीद कर रहा था।






console.log