it-swarm.dev

لا يمكن الوصول إلى خاصية الكائن ، على الرغم من وجودها. إرجاع غير محدد

هذا يحيرني. لا أعرف كيف أشرح ذلك ، لكن هنا هو ما يبدو عليه رمز التصحيح الخاص بي. أدناه ، يمكنك رؤية الإخراج من هذين السجلين. يعرض الأول بوضوح كائن JavaScript الكامل مع الخاصية التي أحاول الوصول إليها ، لكن رمز السطر التالي الذي لا يمكنني الوصول إليه باستخدام config.col_id_3 (راجع "غير معروف" في لقطة الشاشة؟). يمكن لأي شخص أن يفسر هذا؟ يمكنني الوصول إلى كل الممتلكات الأخرى باستثناء field_id_4 أيضًا.

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

هذا هو ما طباعة هذه console.log () في وحدة التحكم

Console output

270
Brian Litzinger

إخراج console.log(anObject) مضلل؛ يتم حل حالة الكائن المعروض فقط عند توسيع > في وحدة التحكم. هو لا حالة الكائن عندما console.log 'd الكائن.

بدلاً من ذلك ، جرّب console.log(Object.keys(config)) ، أو حتى console.log(JSON.stringify(config)) وسترى المفاتيح ، أو حالة الكائن في الوقت الذي اتصلت فيه console.log.

ستجد (عادة) أن المفاتيح تتم إضافتها بعد / مكالمة console.log الخاصة بك.

247
Matt

لقد واجهت للتو هذه المشكلة مع مستند تم تحميله من MongoDB باستخدام Mongoose .

عند تشغيل console.log() على الكائن بالكامل ، ستظهر جميع حقول المستند (كما تم تخزينها في ديسيبل). ومع ذلك ، سيعود بعض أدوات الوصول الفردية إلى undefined ، عندما يعمل آخرون (بما في ذلك _id) بشكل جيد.

تبين أن أدوات الوصول للخصائص لا تعمل إلا في الحقول المحددة في تعريف mongoose.Schema(...) ، بينما console.log() و JSON.stringify() تُرجع جميع الحقول المخزنة في ديسيبل.

الحل (إذا كنت تستخدم Mongoose) : تأكد من تحديد جميع حقول db في mongoose.Schema(...).

38
ramin

تحقق مما إذا كان هناك مجموعة من الكائنات داخل الكائن. واجهت مشكلة مماثلة مع JSON:

    "terms": {
        "category": [
            {
                "ID": 4,
                "name": "Cirugia",
                "slug": "cirugia",
                "description": "",
                "taxonomy": "category",
                "parent": null,
                "count": 68,
                "link": "http://distritocuatro.mx/enarm/category/cirugia/"
            }
        ]
    }

لقد حاولت الوصول إلى مفتاح "name" من "category" وحصلت على undefined error ، لأنني كنت أستخدم:

var_name = obj_array.terms.category.name

ثم أدركت أن لديها أقواس مربعة ، وهذا يعني أن لديها مجموعة من الكائنات داخل مفتاح الفئة ، لأنه يمكن أن يحتوي على أكثر من كائن فئة. لذلك ، للحصول على مفتاح "الاسم" ، استخدمت هذا:

var_name = obj_array.terms.category[0].name

وهذا لا الحيلة.

ربما فات الأوان على هذه الإجابة ، لكنني آمل أن يجد شخص لديه نفس المشكلة هذا كما فعلت قبل العثور على الحل :)

22
Asaf Lopez

الخاصية التي تحاول الوصول إليها قد لا تكون موجودة بعد. يعمل Console.log لأنه ينفذ بعد تأخير بسيط ، ولكن هذا ليس هو الحال بالنسبة لبقية التعليمات البرمجية الخاصة بك. جرب هذا:

var a = config.col_id_3;    //undefined

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

}, 100);
19
Lai Xue

كان لي نفس القضية. الحل بالنسبة لي كان يستخدم الإخراج المعزز كمدخلات لتحليل JSON. هذا عملت لي. نأمل أن يكون مفيدا لك

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

في حالتي ، كنت أقوم بتمرير كائن إلى وعد ، وفي إطار الوعد كنت أضيف المزيد من القيم/القيم إلى الكائن وعندما تم ذلك ، أعاد الوعد الكائن.

ومع ذلك ، نظرًا بسيطًا من جانبي ، كان الوعد بإعادة الكائن قبل اكتماله ... وهكذا كان باقي الكود الخاص بي يحاول معالجة الكائن الذي تم تحديثه والبيانات لم تكن موجودة بعد. ولكن كما هو مذكور أعلاه ، في وحدة التحكم ، رأيت الكائن محدثًا بالكامل ولكن لم أتمكن من الوصول إلى المفاتيح - لقد عادوا بدون تحديد. حتى رأيت هذا:

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. هذا عندما حدث لي أن جسدي كان يجري تقييمه قبل أن يكون الوعد قد قام بتحديثه بالكامل.

9
rolinger

لقد كافحت مع هذه المشكلة اليوم ، واعتقدت أنني سأترك الرد مع حل بلدي.

كنت أحضر كائن بيانات عبر aax ، شيء من هذا القبيل: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

دعنا نقول أن هذا الكائن في متغير يسمى البيانات. كلما أشرت إلى data.i18n ، حصلت على undefined.

  1. console.log(data) أظهر الكائن كما هو متوقع
  2. console.log(Object.keys(data)) said ["constants","i18n"] كما هو متوقع
  3. إعادة تسمية i18n إلى inter لم يغير أي شيء
  4. حتى أنني حاولت تبديل البيانات لجعل "i18n" أول كائن
  5. تم نقل الكود إلى مكانه للتأكد تمامًا من أن الكائن تم ضبطه تمامًا ولم تكن هناك مشكلة في الوعد بأجاكس.

لا شيء ساعد ... ثم على جانب الخادم كتبت البيانات إلى سجل php ، وكشفت هذا:

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

كان "i" في مفتاح الفهرس في الحقيقة u0456 (السيريلية i). لم يكن هذا مرئيًا في محرر php أو سجل وحدة تحكم المتصفح. كشفت فقط سجل php هذا ... كان هذا صعب ...

8
Jette

كانت بياناتي مجرد سلسلة بيانات json. (تم تخزين هذا المتغير كسلسلة json في الجلسة).

console.log(json_string_object)

-> تُرجع فقط تمثيل هذه السلسلة ولا توجد طريقة لإحداث فرق ما إذا كانت سلسلة أم كائنًا.

لكي نجعلها تعمل ، احتجت فقط إلى إعادة تحويلها إلى كائن حقيقي:

object = JSON.parse(json_string_object);
6
makkasi

أنا لا أنشر هنا الكثير بسبب غضب عدم وجود ما يكفي من الوظائف للتعليق ولكن الرجل الذي نشر هذا أدناه كان صحيحا. لم تكن مكالمة ajax مكتملة عندما حاولت الوصول إلى الكائن. سأذهب إلى أبعد من ذلك وأستخدم 500 بدلاً من 100 في المهلة ، فقط للتأكد.

var a = config.col_id_3;    //undefined

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

}, 500);
4
almcaffee

قد يساعد ذلك شخصًا حيث كان لدي مشكلة مشابهة حيث كان JSON.parse () يُرجع كائنًا يمكنني طباعته على console.log () لكنني لم أستطع الوصول إلى الحقول المحددة ولم يعمل أي من الحلول المذكورة أعلاه أنا. مثل استخدام مزيج JSON.parse () مع JSON.stringify ().

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...
3
user_CC

إذا كنت تستخدم TypeScript و/أو ANGULAR ، فقد يكون ذلك!

.then((res: any) => res.json())

تعيين نوع الاستجابة إلى أي إصلاح هذه المشكلة بالنسبة لي ، لم أستطع الوصول إلى الخصائص على الاستجابة حتى أضبط الدقة: أي

راجع هذا السؤال الخاصية '_body' غير موجودة في النوع "Response"

2
russiansummer

لقد واجهت مشكلة مماثلة ، آمل أن يساعد الحل التالي شخصًا ما.
يمكنك استخدامsetTimeoutfunction كما يقترح بعض اللاعبين هنا ، لكنك لا تعلم مطلقًا كم من الوقت يحتاج متصفحك إلى تحديد الكائن الخاص بك.

للخروج من ذلك أود أن أقترح استخدامsetIntervalوظيفة بدلا من ذلك. سينتظر حتى يتم تعريف الكائن الخاص بك config.col_id_3 ثم يطلق الجزء التالي من التعليمات البرمجية الذي يتطلب خصائص كائن معين.

window.addEventListener('load', function(){

    var fileInterval = setInterval(function() {
        if (typeof config.col_id_3 !== 'undefined') {

            // do your stuff here

            clearInterval(fileInterval); // clear interval
        }
    }, 100); // check every 100ms

});
2
Lefan

في عام 2018 تحذرنا موزيلا في مستندات موزيلا هنا !

أقتبس"كائنات التسجيل":

لا تستخدم console.log(obj); ، use console.log(JSON.parse(JSON.stringify(obj)));.

وبهذه الطريقة أنت متأكد من أنك ترى قيمة obj في الوقت الذي تقوم فيه بتسجيل الدخول.

2
MTZ

بالنسبة لي ، اتضح أنها مشكلة ذات صلة بمتناول النمس.

كنت أحلق فوق الأشياء التي حصلت عليها من استعلام Mongo. كان علي فقط إزالة:

await items = Model.find()

واستبدلها بـ:

await items = Model.find().lean()
1
remi2j
config = JSON.parse(config);

كان لدي نفس الشيء ، كانت البيانات نصًا وليس JSON كما كنت أتوقع.

1
obotezat

لقد واجهت نفس المشكلة مع مستند تم تحميله من MongoDB باستخدام Mongoose.

تبين أنني أستخدم الخاصية find() لإرجاع كائن واحد فقط ، لذلك قمت بتغيير find()findOne() وعمل كل شيء بالنسبة لي.

الحل (إذا كنت تستخدم Mongoose): تأكد من إرجاع كائن واحد فقط ، حتى تتمكن من تحليل object.id أو أنه سيتم التعامل معه كصفيف لذلك تحتاج إلى الوصول إليه مثل ذلك object[0].id.

1
Mohamed Hassan Kadri

حاول باستخدام config [0] أو config [0] .col_id_3

لقد واجهت هذه المشكلة فقط أيضًا ، وكنت قادراً على رؤية كائن ، لتسجيل الدخول ، ولكن لا للوصول إليه من التعليمات البرمجية. حاولت بعد ذلك إضافة [0] أمامه وحل مشكلتي. ثم يمكنني الوصول إلى جميع الخصائص.

1
Leonardo Atalla

كان لدي نفس المشكلة ولم يعمل أي حل أعلاه بالنسبة لي وشعرت وكأنني تخمين عمل بعد ذلك. ومع ذلك ، فإن التفاف الكود الخاص بي والذي ينشئ الكائن في دالة 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
});
1
Tushar Shukla

كان لدي مشكلة مماثلة أو ربما ذات الصلة فقط.

بالنسبة لحالتي ، كنت أقوم بالوصول إلى خصائص كائن ما ولكن لم يتم تحديد أحد. لقد وجدت أن المشكلة تمثلت في وجود مساحة بيضاء في الكود الجانبي للخادم أثناء إنشاء المفتاح ، val للكائن.

كان توجهي على النحو التالي ...

 creating my object... notice the white-space in "Word"

 response I get from my REST API

 javascript code to log the values

 log results from console

بعد إزالة المسافة البيضاء من الكود من جانب الخادم الذي ينشئ الكائن ، يمكنني الآن الوصول إلى العقار على النحو التالي ...

 result after removing whitespace

قد لا يكون هذا هو الحال مع قضية سؤال الموضوع ولكن كان بالنسبة لحالتي وقد يكون كذلك بالنسبة لشخص آخر. آمل أن يساعد.

1
rey_coder

في حالتي ، يحدث أنه على الرغم من أنني أتلقى البيانات بتنسيق نموذج مثل myMethod(data:MyModelClass) object حتى يكون الكائن المستلم من سلسلة type. وهو y في console.log (البيانات) أحصل على المحتوى. الحل هو مجرد تحليل JSON (في حالتي)

const model:MyMOdelClass=JSON.parse(data);

الفكر قد يكون مفيدا.

1
Karthikeyan M

واجهت مشكلة من هذا القبيل ، ووجدت أن الحل كان يتعلق بـ 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 كان في الواقع عبارة عن مجمّع Underscore.js حول كائن ، وكان التصحيح الأولي يكذب علي.

0
Marcus Downing

اقتراحات ممتازة. أنا فقط واجهت مشكلة مماثلة لذلك بلدي سنتان. الشيء الوحيد الذي حل المشكلة هو إضافة "json: true" في خيارات طلبي. (يعتمد هذا بالطبع على المكتبة التي تستخدمها ، ولكن الفرضية العامة هي نفسها - حدد تنسيق المحتوى الذي تتوقع استلامه.)

0
itsKarma

كان لي نفس المشكلة اليوم. سبب المشكلة هو uglify-js. بعد أن نفّذت تم حل مشكلة رمز غير مقرف. إزالة من

--mangle-props

من uglify-js كان كافيا للحصول على رمز uglified العمل.

ربما تكون أفضل ممارسة هي استخدام بعض بادئة الخصائص التي يجب تشويهها مع قاعدة regex لـ uglify-js.

هنا هو المصدر:

var data = JSON.parse( content);
...
this.pageIndex = parseInt(data.index);
this.pageTotal = parseInt(data.total);
this.pageLimit = parseInt(data.limit); 

وهنا كيف تم القبيح:

var n = JSON.parse( t);
...
this._ = parseInt(n.index), this.g = parseInt(n.total), this.D = parseInt(n.C)
0
Ilja Kartašov

واجهت نفس المشكلة اليوم. في حالتي كانت المفاتيح متداخلة ، أي key1.key2. قمت بتقسيم المفاتيح باستخدام split () ثم استخدمت ترميز الأقواس المربعة ، والذي كان يعمل لي.

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

لقد قسمت المفاتيح واستخدمتها على هذا النحو ، البيانات [key1] [key2] التي أدت المهمة لي.

0
C.O.G

اقتراحات ممتازة هنا. سأضيف كما قد يجدها شخص ما مفيدًا.

انتبه جيدًا للتخزين المؤقت ، في المتصفح أو عن بُعد.

كنت أعاني من هذا ، حيث إنني أتطور عبر الإنترنت ، ونفذت استراتيجية بسيطة.

  1. أضع برنامج مكافحة التخزين المؤقت في تحميل المتصفح لبرنامج نصي js. اقتباس: "إلحاق سلسلة استعلام"؟ v = 1 "لجميع ملفات .css و .js لمنع التخزين المؤقت."
  2. أضع سجل وحدة تحكم إضافي أقوم بتعديله قبل تجربة طلب جديد: console.log ("")؛ إذا كنت لا أرى هذا السجل الجديد في وحدة التحكم ، فأنا أعلم أن لدي مشكلة في ذاكرة التخزين المؤقت في مكان ما.

بمجرد أن أصلح بناء الجملة الصحيح ، أزلت التأخير المقترح سابقًا ، وكل شيء جيد. بالنسبة لي اضطررت لاستخدام ، "JSON.stringify ("

0
Frieda

فقط إذا كان هذا مفيدًا لشخص ما ، فقد واجهت مشكلة مماثلة ، وذلك لأن شخصًا ما قام بتكوين تخطي لـ .toJSON في الكائن الذي كنت أعمل معه. لذلك كان الكائن شيء مثل:

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

لكن. toJSON () كان:

toJSON() {
  return this.foo
}

لذلك عندما اتصلت بـ JSON.stringify (myObject) ، فإنها تُرجع "{" bar ":" Hello "،" baz ":" World "}". ومع ذلك ، كشف Object.keys (myObject) عن "foo".

0
emote_control

لقد واجهت هذه المشكلة مع الكائنات التي تم إنشاؤها بواسطة csv-parser من ملف CSV الذي تم إنشاؤه بواسطة MS Excel. تمكنت من الوصول إلى جميع الخصائص باستثناء الخاصية الأولى - لكنها ستظهر جيدًا إذا كتبت الكائن بالكامل باستخدام console.log.

اتضح أن تنسيق UTF-8 CSV يدرج 3 بايت (ef bb bf) في البداية المطابقة للحرف غير المرئي - الذي تم تضمينه كجزء من رأس الخاصية الأول بواسطة محلل csv. كان الحل هو إعادة إنشاء ملف CSV باستخدام خيار غير UTF وهذا ما أدى إلى التخلص من الشخصية غير المرئية.

0
Mike Rizzo

واجهت مشكلة مماثلة (عند تطوير برنامج 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() ، نداءها غير المتزامن لذلك اضطررت إلى إعادة كتابة الكود الخاص بي إلى:

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);
    }
});
0
Mariyo