Konsol günlüğünde görünmesine rağmen nesne özelliğine erişilemiyor


329

Aşağıda, bu iki günlükten elde edilen çıktıları görebilirsiniz. İlk açıkça erişmeye çalıştığım özelliği ile tam nesneyi gösterir, ama kodun bir sonraki satırında, ben ile erişemiyorum config.col_id_3(ekran görüntüsünde "tanımsız" bakın?). Herkes bunu açıklayabilir mi? Ben de dışında her özelliğe erişebilirsiniz field_id_4.

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

Bu çizgiler Konsolda yazdırılıyor

Konsol çıkışı


6
denemek console.log(JSON.stringify(config));ans paylaşmak o / p
Arun P Johny

2
Ayrıca, console.log (config ['col_id_3']) çalışıyorsa bunu deneyin;
zzlalani

5
bu benim için çalıştı. dize çıktısını çalışan bir nesne için yeni girdi olarak kullanma: JSON.parse (JSON.stringify (obj))
Tope

2
Dizgileştirme ve sonra ayrıştırma, bir nedenden dolayı benim için sorunu çözmedi. Ancak tam olarak ayrıştırma yaptı. JSON.parse(obj)
JacobPariseau

3
Bazı nedenlerden dolayı, tüm cevaplar nesneye anahtar olmadan nasıl kaydedileceğini, anahtara nasıl erişileceğini değil
açıklar

Yanıtlar:


296

Çıkışı console.log(anObject)yanıltıcıdır; görüntülenen nesnenin durumu yalnızca >konsolda genişletildiğinde çözülür . Öyle değil ne zaman nesnenin devlet console.log'nesne d.

Bunun yerine, deneyin console.log(Object.keys(config))veya hatta console.log(JSON.stringify(config))ve aradığınız anda anahtarları veya nesnenin durumunu göreceksiniz console.log.

Sen (genellikle) tuşları ekleniyor bulacaksınız sonra da console.logçağrı.


11
Bu davranış bir hata mı yoksa özellik mi? Eğer bir özellikse, bunun ardındaki neden nedir?
ESR

2
Peki bu nasıl olur? Zaman aşımı ayarlamak iyi bir çözüm gibi görünmemektedir.
Sahand

9
O zaman bu özelliğe nesneden nasıl erişebiliriz?
Rohit Sharma

Açıklığa kavuşturmak için, >bir dizinin genişletilmesine veya bir nesneye bağlı olarak düğmenin davranışı farklı mıdır?
Flimm

Bazı testler yapıyor, bir dizi ile bile bu sorunla karşılaşmış gibi görünüyor, bu yüzden bunun yerine JSON.stringify yapmanızı tavsiye ederim.
Flimm

62

Ben sadece Mongoose kullanarak MongoDB yüklü bir belge ile bu sorunu yaşadım .

console.log()Tüm nesne üzerinde çalışırken , tüm belge alanları (db'de saklandığı gibi) görünecektir. Bununla birlikte, bazı bireysel mülk erişimcileri undefined, diğerleri (dahil _id) iyi çalıştığında geri dönecektir .

Mülkiyet erişimcileri sadece bu benim belirtilen alanlar için çalıştığını ortaya çıktı mongoose.Schema(...), oysa tanımı, console.log()ve JSON.stringify()tüm alanları db depolanan getiriler.

Çözüm (Mongoose kullanıyorsanız) : tüm db alanlarınızın tanımlandığından emin olun mongoose.Schema(...).


Bu sorunun büyük açıklaması, Mongoose'un bir şema olmadan (harici bir komut dosyasında) json'u sorgulamama izin vereceğini, ancak yazmaları engelleyeceğini düşündüm. _İd olduğu için çalışıyor gibi görünüyor ve console.log, diğer her şeyin erişilebilir olması gerektiğini söylüyor, ancak değil. Tuhaf.
bstar

7
Bunu görüyorum çünkü verilen nesnenin bir işlevi varsa JSON.stringify()(ve Düğümler console.log()) davranışlarını değiştiriyor .toJSON(). Gördüğünüz çıktı .toJSON(), orijinal nesne değil, döndürülen çıktıdır . Mongoose size .toJSON()altta yatan db nesnesini veren bir model nesneleri verir. Model nesnesinin yalnızca şemada tanımladığınız alanlar için erişimcileri vardır, ancak daha sonra tüm db alanları günlüğe kaydettiğinizde görünür, çünkü aslında tarafından döndürülen temel nesneyi görürsünüz .toJSON().
ramin

Firavun faresi neden başka özellikleri okumaya izin vermiyor?
Kannan T

Mongodb içine bir CSV yüklerken ve özelliği getirirken bu benim için yararlı oldu. Adlarınızın eşleştiğinden emin olun. Harika cevap teşekkür ederim.
9BallOnTheSnap

1
Bunun için teşekkür ederim. Konsolda görmeye ve erişememe deli oluyordum. Şemama değer ekledi ve ben gitmek iyi. Tekrar teşekkürler!
alittletf

27

Nesnenin içinde bir dizi nesne olup olmadığını kontrol edin. Bir JSON ile benzer bir sorun vardı:

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

Ben 'kategori' 'isim' anahtar erişmek için çalıştı ve ben kullanıyordum çünkü tanımsız hata aldım :

var_name = obj_array.terms.category.name

Sonra köşeli parantez olduğunu fark ettim, yani kategori anahtarının içinde bir dizi nesne var, çünkü birden fazla kategori nesnesine sahip olabilir. Yani, 'isim' anahtarını almak için şunu kullandım:

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

Ve bu hile yapar.

Belki bu cevap için çok geç, ama umarım aynı problemi olan bir kişi bunu Çözümü bulmadan önce yaptığım gibi bulur :)


23

Aynı sorunu yaşadım. Benim için çözüm dizeli çıktıyı JSON ayrıştırmak için girdi olarak kullanıyordu. bu benim için çalıştı. umarım senin için yararlıdır

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

2
Evet işe yaradı, ama bu neden gerekli? Zaten bir JSON'um var, neden bunu yapmam gerekiyor?
jain

@dilpeshjain Tam olarak emin değilim, ama aslında JSON'umuz yok (belki de tembel bir yükleme senaryosu var, şu anda bu konuda yeterince bilgili değilim), ama elimizde ne varsa geçiyoruz JSON.stringify içine bir dize döndürülmesini gerektirir (yazdırmak için console.log çağrısı gereksinimleri gibi). En azından bir dize alabileceğimi bildiğim için, o dizeyi hemen bir JSON nesnesi oluşturmak için kullanabilirim.
Tope

4
@jain javascript korkunç bir dil olduğu için buna ihtiyacınız var

22

Erişmeye çalıştığınız mülk henüz mevcut olmayabilir. Console.log, küçük bir gecikmeden sonra çalıştığı için çalışır, ancak kodunuzun geri kalanı için durum böyle değildir. Bunu dene:

var a = config.col_id_3;    //undefined

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

}, 100);

1
Nesne değerlerimi elde etmek için metodu yüklerdim ama yine de ilk defa beni tanımsız kılıyor .. Bu dil beni her gün ölü yapıyor
Teoman Tıngır

kolay bir çözüm, istenen özelliğin setTimeout ile tanımlanıp tanımlanmadığını kontrol eden ve özellik kullanılabilir hale geldiğinde zaman aşımını gideren + temizleyen bir gözlemci sözü uygulamak olacaktır.
Lai Xue

Vay. 15 yıllık web programlamamda bununla hiç karşılaşmamıştım ve konsol günlüğünün nasıl çalıştığını hiç düşünmemiştim. Cevabınız bunlardan bazılarının temizlenmesine yardımcı oldu.
Kai Qing

12

Benim durumumda bir nesneyi bir söze geçiriyordum, sözün içinde nesneye daha fazla anahtar / değer ekliyordum ve söz verildiğinde söz konusu nesneyi geri verdi.

Ancak, benim tarafımdan hafif bir bakış, söz tamamen tamamlanmadan önce nesneyi döndürüyordu ... böylece kodumun geri kalanı güncellenen nesneyi işlemeye çalışıyordu ve veriler henüz orada değildi. Ancak yukarıdaki gibi, konsolda, nesnenin tamamen güncellendiğini gördüm, ancak anahtarlara erişemedim - tanımsız geri geliyorlardı. Bunu görene kadar:

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*

Üzerine geldiğimde [i] küçük bir ikon Object value at left was snapshotted when logged, value below was evaluated just now. Bu sözümü tam olarak güncellemeden önce nesnemin değerlendirildiği başıma geldi.


10

Bugün bu sorunla mücadele ettim ve çözümümle ilgili bir cevap bırakacağımı düşündüm.

Ajax, böyle bir şey ile bir veri nesnesi getiriyordu: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

Diyelim ki bu nesne data adında bir değişkende. Ne zaman başvuruda data.i18nbulunsam undefined.

  1. console.log(data) nesneyi beklendiği gibi gösterdi
  2. console.log(Object.keys(data))["constants","i18n"]beklendiği gibi dedi
  3. Yeniden adlandırma i18n için Inter şey değişmedi
  4. Hatta ilk nesneyi "i18n" yapmak için veri değiştirmeye çalıştım
  5. Nesnenin tamamen ayarlandığından ve ajax sözüyle ilgili bir sorun olmadığından emin olmak için kod taşındı.

Hiçbir şey yardımcı olmadı ... Sonra sunucu tarafında veri php günlüğüne yazdı ve bunu ortaya koydu:

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

İndeks anahtarındaki "i" aslında bir u0456 (kiril i) idi. Bu benim php düzenleyicimde veya tarayıcı konsolu günlüğünde görünmedi. Sadece php günlüğü bunu ortaya çıkardı ... Bu zor biriydi ...


1
Bu da benim sorunumdu; bazı durumlarda bunun yerine Kiril 'c' karakteri vardı. Beklediğim dize için dosyamı arayarak buldum; şüpheli olan seçilmedi, bu yüzden bana gözle görülemeyen yanlış bir karakter olduğunu söyledi.
knighter

Bu cevap aslında çözümümü bulmama yardımcı oldu. Benim sorunum değişken ismimi yanlış yazmıştım. Ben "güncelleme" lol yerine "udpate" yaptım
Savlon

8

Verilerim sadece json veri dizgisiydi. (Bu değişken oturumda json dizesi olarak saklanmıştır).

console.log(json_string_object)

-> yalnızca bu dizenin temsilini döndürür ve dize ya da nesne olup olmadığını fark etmenin bir yolu yoktur.

Bu yüzden çalışması için sadece gerçek nesneye dönüştürmem gerekiyordu:

object = JSON.parse(json_string_object);

Benim için çalışan tek cevap buydu ve orijinal sorunun yorumlarında da belirtildi, bu daha yüksek olmalı.
abagh0703

5

2018'de Mozilla bizi burada Mozilla Docs'ta uyarıyor !

Ben "Nesneleri Günlüğe Kaydetme" teklif :

Kullanma console.log(obj);, kullanma console.log(JSON.parse(JSON.stringify(obj)));.

Bu şekilde, giriş yaptığınız anda obj'in değerini gördüğünüzden emin olabilirsiniz.


4

JSON.parse (), console.log () üzerinde yazdırabileceğim bir nesneyi döndürdüğü benzer bir sorun yaşadığım için bu birine yardımcı olabilir, ancak belirli alanlara erişemedim ve yukarıdaki çözümlerin hiçbiri işe yaramadı ben mi. JSON.parse () ile JSON.stringify () birleşimini kullanmak gibi.

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 () tarafından sağlanan farklı bir ayrıştırıcı kullanarak sorunu çözdü;

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

2

Benim durumumda, sadece myMethod(data:MyModelClass) alınan nesne türü dize olana kadar nesne gibi bir model biçiminde veri almak olsa da olur . Hangi y konsol.log (veri) içeriği olsun. Çözüm sadece JSON'u (benim durumumda) ayrıştırmaktır

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

Düşünce yararlı olabilir.


2

MS Excel tarafından oluşturulan bir CSV dosyasından csv-parser tarafından oluşturulan nesnelerle bu sorunla yeni karşılaştım. İlk özellik dışında tüm özelliklere erişebildim - ama tüm nesneyi console.log kullanarak yazsaydım tamam görünecekti.

UTF-8 CSV formatının başlangıçta görünmez bir karaktere karşılık gelen 3 bayt (ef bb bf) eklediği ortaya çıktı - bunlar csv-parser tarafından ilk özellik başlığının bir parçası olarak dahil edildi. Çözüm, UTF olmayan seçeneği kullanarak CSV'yi yeniden oluşturmaktı ve bu görünmez karakteri ortadan kaldırdı.


Sen bir kahramansın! Bunu gönderdiğiniz için teşekkürler. Saçımı çekiyordum.
Ürdün S

Bunu gönderdiğiniz için tekrar teşekkürler! Gecemi kurtardım!
Oliver Hickman

2

Benzer bir sorun yaşadım, umarım aşağıdaki çözüm birisine yardımcı olur. Buradaki işlevi bazı kişilerin önerdiği gibi
kullanabilirsiniz setTimeout, ancak tarayıcınızın nesnenizi tanımlamak için tam olarak ne kadar sürmesi gerektiğini asla bilemezsiniz.

setIntervalBunun yerine işlevini kullanmanızı öneririm . Nesneniz config.col_id_3tanımlanana kadar bekleyecek ve daha sonra belirli nesne özelliklerinizi gerektiren bir sonraki kod parçanızı tetikleyecektir.

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

});


1

Aynı sorunu yaşadım ve yukarıdaki hiçbir çözüm benim için işe yaramadı ve daha sonra tahmin çalışması gibi hissettim. Ancak, bir setTimeoutişlevde nesneyi oluşturan kodumu sarmak benim için hile yaptı.

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

Benzer bir sorun yaşadım ya da belki de sadece ilgili.

Benim durumum için bir nesnenin özelliklerine erişiyordum ama biri tanımsızdı. Ben nesnenin anahtarı, val oluştururken sunucu tarafı kodunda bir boşluk olduğunu buldum.

Benim yaklaşımım şöyleydi ...

nesnemi oluşturuyorum ... "word" içindeki boşluklara dikkat edin

REST API'mdan yanıt aldım

değerleri günlüğe kaydetmek için javascript kodu

sonuçları konsoldan kaydet

Beyaz alanı, nesneyi oluşturan sunucu tarafı kodundan kaldırdıktan sonra, özelliğe aşağıdaki gibi erişebilirim ...

boşluk kaldırıldıktan sonra sonuç

Bu konudaki soru ile ilgili bir sorun olmayabilir ama benim durumum içindi ve başka biri için de olabilir. Umarım yardımcı olur.


1

Mongoose kullanarak MongoDB'den yüklenen bir belge ile aynı sorunu yaşadım.

İ özelliğini kullanıyorum ortaya çıktı find()ı değiştirdi, böylece sadece bir nesneyi döndürmek için find()için findOne()ve her şey benim için çalıştı.

Çözüm (Mongoose kullanıyorsanız): Yalnızca bir nesneyi döndürdüğünüzden emin olun, böylece nesnesini ayrıştırabilirsiniz, object.idaksi takdirde ona böyle erişmeniz gerekir object[0].id.


1

Benim için Mongoose ile ilgili bir sorun olduğu ortaya çıktı.

Bir Mongo sorgusundan aldığım nesneler üzerinde dönüyordum. Sadece kaldırmak zorunda kaldım:

items = await Model.find()

Ve şu şekilde değiştirin:

items = await Model.find().lean()

0

Böyle bir sorunum vardı ve çözümün Underscore.js ile ilgili olduğunu gördüm. İlk günlüğümün anlamı yoktu:

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

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

console.log(obj.code);

> undefined

Çözümü nesnenin anahtarlarına da bakarak buldum:

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

> ["_wrapped","_chain"]

Bu, objbunun aslında bir nesnenin etrafındaki bir Underscore.js ambalajı olduğunu ve ilk hata ayıklamanın bana yalan söylediğini anlamamı sağladı.


0

Şununla başladığımda benzer bir sorunum vardı (SugarCRM için geliştirirken):

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);

Sorun oldu fetch(), onun zaman uyumsuz çağrı böylece kodumu yeniden yazmak zorunda kaldım:

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

Bunun birisi için yararlı olması durumunda, benzer bir sorunum vardı ve bunun nedeni birisinin birlikte çalıştığım nesnede .toJSON için bir geçersiz kılma oluşturması. Yani nesne şöyleydi:

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

Ancak .toJSON ():

toJSON() {
  return this.foo
}

JSON.stringify (myObject) öğesini çağırdığımda "{" bar ":" Hello "," baz ":" World "}" döndürdü. Ancak, Object.keys (myObject) "foo" yu ortaya çıkardı.


toJson()burada kimsenin bahsetmediği nokta bu. Bu cevabın neden reddedildiğini bilmiyorum, çünkü bu json veya konsol temsilinden farklı bir değere sahip bir nesne oluşturmanın bir yoludur. Farklı bir cevapta ortaya çıkana kadar var olduğunu bilmiyordum ve bence bu cevap bu tür konularla ilgilenmek için bir nokta.
Rick Love

Tam olarak 0 puanı olan cevapların sayısı göz önüne alındığında, birisinin her şeyi küçümsediğini düşünüyorum.
emote_control

0

Bugün aynı problemle karşılaştım. Benim durumumda anahtarlar iç içe geçmişti, yani key1.key2. Anahtarları split () kullanarak böldüm ve sonra benim için işe yarayan köşeli parantez gösterimini kullandım.

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

Anahtarları ayırdım ve bu şekilde kullandım, işi benim için yapan veri [key1] [key2].


0

Bugün de aynı sorunu yaşadım. Sorun uglify-js'den kaynaklandı. Ben yürüttükten sonra aynı uglified kod sorunu çözüldü. Kaldırılıyor

--mangle-props

uglify-js çalışan uglified kodu için yeterliydi.

Belki de en iyi uygulama uglify-js için regex kuralıyla karıştırılması gereken özellikler için bazı önek kullanmaktır.

İşte kaynak:

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

ve işte böyle çirkinleşti:

var n = JSON.parse( t);
...
this._ = parseInt(n.index), this.g = parseInt(n.total), this.D = parseInt(n.C)

0

JSON stringify / parse'nin hiçbiri benim için çalışmadı.

formValues.myKey:               undefined
formValues.myKey with timeout:  content

Ben değerini istedim ve formValues.myKeyhile bir setTimeout 0 oldu aşağıdaki örnekte olduğu gibi. Umarım yardımcı olur.

console.log('formValues.myKey: ',formValues.myKey);
setTimeout( () => { 
  console.log('formValues.myKey with timeout: ', formValues.myKey);
}, 0 );

0

Ben de sadece bu sorunla karşılaştı ve uzun hikaye kısa benim API JSON değil, bir dize türü döndürüyordu. Bu yüzden günlüğe yazdırdığınızda tam olarak aynı görünüyordu, ancak özelliklere erişmeye çalıştığımda bana tanımsız bir hata verdi.

API Kodu:

     var response = JsonConvert.DeserializeObject<StatusResult>(string Of object);
     return Json(response);

daha önce sadece iade edildi:

return Json(string Of object);

0

Bugün React'ta da benzer bir sorun yaşadım. Sonunda sorunun devletin henüz kurulmamasından kaynaklandığını fark etti. Arama user.user.nameyapıyordum ve konsolda görünmesine rağmen user.user, ayarlanıp ayarlanmadığını kontrol etmek için bir kontrol ekleyene ve sonra çağırana kadar bileşenime erişemedim user.user.name.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.