Tidak dapat mengakses properti objek, meskipun itu muncul di log konsol

329

Di bawah, Anda dapat melihat output dari dua log ini. Yang pertama jelas menunjukkan objek penuh dengan properti yang saya coba akses, tetapi pada baris kode berikutnya, saya tidak dapat mengaksesnya dengan config.col_id_3(lihat "tidak terdefinisi" pada tangkapan layar?). Adakah yang bisa menjelaskan ini? Saya bisa mendapatkan akses ke setiap properti lain kecuali field_id_4juga.

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

Inilah yang dicetak garis-garis ini di Konsol

Output konsol

Brian Litzinger
sumber
6
console.log(JSON.stringify(config));Dapatkah Anda mencoba dan berbagi o / p
Arun P Johny
2
coba juga ini, jika ini berfungsi console.log (config ['col_id_3']);
zzlalani
5
ini berhasil untuk saya. menggunakan output yang diketik sebagai input baru untuk objek yang berfungsi: JSON.parse (JSON.stringify (obj))
Tope
2
Merancang dan kemudian mem-parsing tidak memecahkan masalah bagi saya, untuk beberapa alasan. Namun parsing langsung melakukannya. JSON.parse(obj)
JacobPariseau
3
Untuk beberapa alasan semua jawaban menjelaskan cara mencatat objek tanpa kunci, bukan cara mengakses kunci
remidej

Jawaban:

296

Output dari console.log(anObject)ini menyesatkan; keadaan objek yang ditampilkan hanya diselesaikan ketika Anda memperluas >konsol. Ini bukan keadaan objek saat Andaconsole.log objek.

Sebagai gantinya, coba console.log(Object.keys(config)), atau bahkan console.log(JSON.stringify(config))dan Anda akan melihat kunci, atau keadaan objek pada saat Anda meneleponconsole.log .

Anda akan (biasanya) menemukan kunci yang ditambahkan setelahconsole.log panggilan Anda .

Mat
sumber
11
Apakah perilaku ini bug atau fitur? Jika itu fitur, apa alasan di baliknya?
ESR
2
Bagaimana cara menyiasatinya? Mengatur batas waktu TIDAK tampak seperti solusi yang baik.
Sahand
9
Lalu bagaimana kita dapat mengakses properti ini, dari objek?
Rohit Sharma
Untuk memperjelas, apakah perilaku >tombol berbeda tergantung pada apakah array sedang diperluas, atau suatu objek?
Flimm
Melakukan beberapa pengujian, tampaknya Anda telah menemukan masalah ini bahkan dengan sebuah array, jadi saya akan merekomendasikan melakukan JSON.stringify sebagai gantinya.
Flimm
62

Saya baru saja mengalami masalah ini dengan dokumen yang dimuat dari MongoDB menggunakan Mongoose .

Saat berjalan console.log()pada seluruh objek, semua bidang dokumen (seperti yang disimpan dalam db) akan muncul. Namun beberapa pengakses properti individual akan kembali undefined, ketika yang lain (termasuk _id) bekerja dengan baik.

Ternyata pengakses properti hanya berfungsi untuk bidang yang ditentukan dalam mongoose.Schema(...)definisi saya , sedangkan console.log()dan JSON.stringify()mengembalikan semua bidang yang disimpan dalam db.

Solusi (jika Anda menggunakan Mongoose) : pastikan semua bidang db Anda didefinisikan mongoose.Schema(...).

ramin
sumber
Penjelasan hebat dari masalah ini, saya pikir Mongoose akan membiarkan saya meminta json tanpa skema (dalam skrip eksternal), tetapi akan mencegah menulis. Tampaknya berfungsi karena _id ada, dan console.log mengatakan segalanya harus dapat diakses, tetapi tidak. Aneh.
bstar
7
Ternyata saya melihat ini karena JSON.stringify()(dan Node console.log()) mengubah perilaku mereka jika objek yang diberikan memiliki .toJSON()fungsi. Output yang Anda lihat adalah apa yang .toJSON()dikembalikan, dan bukan objek aslinya. Mongoose memberi Anda objek model dengan .toJSON()yang memberikan objek db yang mendasarinya. Objek model hanya memiliki pengakses untuk bidang yang Anda tentukan dalam skema, tetapi kemudian semua bidang db muncul ketika Anda login karena Anda benar-benar melihat objek yang mendasarinya dikembalikan oleh .toJSON().
ramin
Mengapa luwak tidak mengizinkan untuk membaca properti lain yang kamu punya ide?
Kannan T
Ini bermanfaat bagi saya ketika mengunggah CSV ke mongodb dan mengambil properti. Pastikan nama Anda cocok. Jawaban yang bagus terima kasih.
9BallOnTheSnap
1
Terima kasih untuk ini. Saya jadi gila melihatnya di konsol dan tidak bisa mengaksesnya. Menambahkan nilai ke skema saya dan saya baik-baik saja. Terima kasih lagi!
alittletf
27

Periksa apakah di dalam objek ada array objek. Saya memiliki masalah serupa dengan JSON:

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

Saya mencoba mengakses kunci 'nama' dari 'kategori' dan saya mendapatkan kesalahan yang tidak terdefinisi , karena saya menggunakan:

var_name = obj_array.terms.category.name

Kemudian saya menyadari bahwa ia memiliki tanda kurung siku, yang berarti ia memiliki larik objek di dalam kunci kategori, karena dapat memiliki lebih dari satu objek kategori. Jadi, untuk mendapatkan kunci 'nama' saya menggunakan ini:

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

Dan itu berhasil.

Mungkin sudah terlambat untuk jawaban ini, tetapi saya berharap seseorang dengan masalah yang sama akan menemukan ini seperti yang saya lakukan sebelum menemukan Solusi :)

Asaf Lopez
sumber
23

Saya memiliki masalah yang sama. Solusi bagi saya adalah menggunakan output yang dirumuskan sebagai input untuk mem-parsing JSON. ini berhasil untuk saya. Semoga bermanfaat bagi Anda

var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);
Minum minuman keras
sumber
2
Ya itu berhasil, tetapi mengapa ini diperlukan? Saya sudah memiliki JSON, mengapa saya perlu melakukan ini?
jain
@dilpeshjain Saya tidak yakin, tapi saya berani bahwa kita tidak benar-benar sudah memiliki JSON (mungkin ada skenario jenis pemuatan malas yang terjadi, saya tidak cukup berpengetahuan tentang itu saat ini), tetapi melewati apa pun yang kita miliki ke JSON.stringify membutuhkan string untuk dikembalikan (seperti kebutuhan panggilan console.log untuk mencetak). Karena saya tahu saya setidaknya bisa mendapatkan string, maka saya bisa menggunakan string itu untuk membuat objek JSON pasti segera.
Tope
4
@jain Anda memerlukan ini karena javascript adalah bahasa yang mengerikan
22

Properti yang Anda coba akses mungkin belum ada. Console.log berfungsi karena dijalankan setelah penundaan kecil, tetapi itu tidak berlaku untuk sisa kode Anda. Coba ini:

var a = config.col_id_3;    //undefined

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

}, 100);
Lai Xue
sumber
1
Saya menggunakan metode onload untuk mendapatkan nilai objek saya. Tetapi masih memberi saya tidak terdefinisi pada saat pertama .. Bahasa ini membuat saya mati hari demi hari
Teoman Tıngır
solusi mudahnya adalah dengan menerapkan janji pengamat yang memeriksa apakah properti yang diinginkan ditentukan dengan setTimeout, dan menyelesaikan + menghapus batas waktu begitu properti tersedia.
Lai Xue
Wow. Dalam sekitar 15 tahun pemrograman web saya, saya belum pernah menemukan ini dan tidak pernah memikirkan bagaimana konsol log bekerja. Jawaban Anda membantu menjernihkannya.
Kai Qing
12

Dalam kasus saya, saya menyerahkan objek ke janji, dalam janji saya menambahkan lebih banyak kunci / nilai ke objek dan ketika itu dilakukan janji mengembalikan objek.

Namun, dengan sedikit melihat pada bagian saya, janji itu mengembalikan objek sebelum sepenuhnya selesai ... sehingga sisa kode saya sedang mencoba untuk memproses objek yang diperbarui dan data belum ada di sana. Tapi seperti di atas, di konsol, saya melihat objek sepenuhnya diperbarui tetapi tidak dapat mengakses kunci - mereka kembali tidak terdefinisi. Sampai saya melihat ini:

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] adalah ikon kecil, ketika saya mendekatinya katanya Object value at left was snapshotted when logged, value below was evaluated just now. Itulah ketika saya sadar bahwa objek saya sedang dievaluasi sebelum janji telah memperbaruinya sepenuhnya.

rolinger
sumber
10

Saya berjuang dengan masalah ini hari ini, dan berpikir saya akan meninggalkan balasan dengan solusi saya.

Saya mengambil objek data melalui ajax, sesuatu seperti ini: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

Katakanlah objek ini dalam variabel yang disebut data. Setiap kali saya referensi data.i18nsaya mendapat undefined.

  1. console.log(data) menunjukkan objek seperti yang diharapkan
  2. console.log(Object.keys(data))kata ["constants","i18n"]seperti yang diharapkan
  3. Mengganti nama i18n ke inter tidak mengubah apa pun
  4. Saya bahkan mencoba mengganti data untuk menjadikan "i18n" objek pertama
  5. Pindah kode di sekitar untuk memastikan benar-benar objek itu benar-benar diatur dan tidak ada masalah dengan janji ajax.

Tidak ada yang membantu ... Kemudian di sisi server saya menulis data ke log php, dan itu mengungkapkan ini:

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

"I" pada kunci indeks sebenarnya adalah u0456 (cyrillic i). Ini tidak terlihat di editor php saya atau log konsol browser. Hanya log php yang mengungkapkan ini ... Itu yang rumit ...

Jette
sumber
1
Ini juga masalah saya; memiliki karakter 'c' Cyrillic sebagai gantinya dalam beberapa kasus. Saya menemukannya dengan mencari file saya untuk string yang saya harapkan; yang mencurigakan tidak dipilih, sehingga memberitahuku ada karakter yang salah yang tidak terlihat oleh mata.
knight
Jawaban ini sebenarnya membantu saya menemukan solusi saya. Masalah saya adalah saya salah mengeja nama variabel saya. Saya melakukan "udpate" bukannya "memperbarui" lol
Savlon
8

Data saya hanya string data json. (Variabel ini disimpan sebagai string json di sesi).

console.log(json_string_object)

-> mengembalikan hanya representasi string ini dan tidak ada cara untuk membuat perbedaan apakah string atau objek.

Jadi untuk membuatnya bekerja, saya hanya perlu mengubahnya kembali menjadi objek nyata:

object = JSON.parse(json_string_object);
makkasi
sumber
Ini adalah satu-satunya jawaban yang bekerja untuk saya dan juga disebutkan dalam komentar dari pertanyaan awal, ini harus lebih tinggi.
abagh0703
5

Pada 2018 Mozilla memperingatkan kita di Mozilla Docs di sini !

Saya mengutip "Objek Pencatatan" :

Jangan gunakan console.log(obj);, gunakanconsole.log(JSON.parse(JSON.stringify(obj))); .

Dengan cara ini Anda yakin Anda melihat nilai obj pada saat Anda mencatatnya.

MTZ
sumber
4

Ini mungkin membantu seseorang karena saya memiliki masalah serupa di mana JSON.parse () mengembalikan objek yang bisa saya cetak di console.log () tapi saya tidak bisa mengakses bidang tertentu dan tidak ada solusi di atas yang berfungsi untuk saya. Seperti menggunakan kombinasi JSON.parse () dengan 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  

Saya akhirnya memecahkan masalah dengan menggunakan parser berbeda yang disediakan oleh ExtJs Ext.decode ();

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

Dalam kasus saya, kebetulan bahwa meskipun saya menerima data dalam format model seperti myMethod(data:MyModelClass) objek sampai objek yang diterima adalah tipe string. Yaitu di console.log (data) saya mendapatkan konten. Solusi hanya untuk mengurai JSON (dalam kasus saya)

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

Pikiran mungkin bermanfaat.

Karthikeyan M
sumber
2

Saya baru saja mengalami masalah ini dengan objek yang dihasilkan oleh csv-parser dari file CSV yang dihasilkan oleh MS Excel. Saya dapat mengakses semua properti kecuali properti pertama - tetapi akan muncul ok jika saya menulis seluruh objek menggunakan console.log.

Ternyata format CSF UTF-8 memasukkan 3 byte (ef bb bf) di awal yang sesuai dengan karakter yang tidak terlihat - yang dimasukkan sebagai bagian dari header properti pertama oleh csv-parser. Solusi adalah untuk menghasilkan kembali CSV menggunakan opsi non-UTF dan ini menghilangkan karakter yang tidak terlihat.

Mike Rizzo
sumber
Anda seorang pahlawan! Terima kasih telah memposting ini. Saya mencabut rambut saya.
Jordan S
Sekali lagi terima kasih telah memposting ini! Selamat malam saya!
Oliver Hickman
2

Saya pernah mengalami masalah serupa, semoga solusi berikut membantu seseorang.
Anda dapat menggunakan setTimeoutfungsi seperti yang disarankan beberapa orang di sini, tetapi Anda tidak pernah tahu berapa lama browser Anda perlu mendefinisikan objek Anda.

Dari itu saya sarankan menggunakan setIntervalfungsi saja. Ini akan menunggu sampai objek Anda config.col_id_3didefinisikan dan kemudian jalankan bagian kode Anda berikutnya yang membutuhkan properti objek spesifik Anda.

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

});
Lefan
sumber
2

jika Anda menggunakan TYPESCRIPTdan / atau ANGULAR, bisa jadi ini!

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

mengatur tipe respons ke masalah apa pun yang diperbaiki untuk saya, saya tidak bisa mengakses properti pada respons sampai saya mengatur res: any

lihat pertanyaan ini Properti '_body' tidak ada pada tipe 'Respons'

russiansummer
sumber
1

Saya memiliki masalah yang sama dan tidak ada solusi di atas yang bekerja untuk saya dan rasanya seperti menebak setelahnya. Namun, membungkus kode saya yang membuat objek dalam suatu setTimeoutfungsi melakukan trik untuk saya.

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
});
Tushar Shukla
sumber
1

Saya memiliki masalah serupa atau mungkin hanya terkait.

Untuk kasus saya, saya sedang mengakses properti dari suatu objek tetapi satu tidak terdefinisi. Saya menemukan masalahnya adalah ruang putih di kode sisi server sambil membuat kunci, val objek.

Pendekatan saya adalah sebagai berikut ...

membuat objek saya ... perhatikan ruang putih di "kata"

respon yang saya dapatkan dari API REST saya

kode javascript untuk mencatat nilainya

mencatat hasil dari konsol

Setelah menghapus white-space dari kode sisi server membuat objek, sekarang saya bisa mengakses properti seperti di bawah ini ...

hasil setelah menghapus spasi

Ini mungkin bukan masalah dengan kasus pertanyaan subjek tetapi untuk kasus saya dan mungkin demikian untuk orang lain. Semoga ini bisa membantu.

rey_coder
sumber
1

Saya baru saja mengalami masalah yang sama dengan dokumen yang dimuat dari MongoDB menggunakan Mongoose.

Ternyata saya menggunakan properti find()untuk mengembalikan hanya satu objek, jadi saya berubah find()menjadifindOne() dan semuanya bekerja untuk saya.

Solusi (jika Anda menggunakan Mongoose): Pastikan untuk mengembalikan satu objek saja, sehingga Anda dapat menguraikannya object.idatau akan diperlakukan sebagai array sehingga Anda perlu mengaksesnya seperti itu object[0].id.

Mohamed Hassan Kadri
sumber
1

Bagi saya itu ternyata masalah yang berhubungan dengan Mongoose.

Saya mengulang-ulang objek yang saya dapatkan dari permintaan Mongo. Saya hanya perlu menghapus:

items = await Model.find()

Dan ganti dengan:

items = await Model.find().lean()
remidej
sumber
0

Saya punya masalah seperti ini, dan menemukan solusinya adalah dengan Underscore.js. Pencatatan awal saya tidak masuk akal:

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

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

console.log(obj.code);

> undefined

Saya menemukan solusinya dengan juga melihat kunci-kunci objek:

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

> ["_wrapped","_chain"]

Hal ini membuat saya sadar bahwa objitu sebenarnya pembungkus Underscore.js di sekitar objek, dan debugging awal berbohong kepada saya.

Marcus Downing
sumber
0

Saya memiliki masalah yang sama (ketika mengembangkan untuk SugarCRM), di mana saya mulai dengan:

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

Masalahnya adalah fetch(), panggilan asyncnya jadi saya harus menulis ulang kode saya menjadi:

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

Kalau-kalau ini berguna untuk seseorang, saya punya masalah yang sama, dan itu karena seseorang membuat override untuk .toJSON pada objek yang saya kerjakan. Jadi objeknya seperti:

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

Tapi .toJSON () adalah:

toJSON() {
  return this.foo
}

Jadi ketika saya menelepon JSON.stringify (myObject), ia mengembalikan "{" bar ":" Hello "," baz ":" World "}". Namun, Object.keys (myObject) mengungkapkan "foo".

emote_control
sumber
toJson()ini adalah poin yang tidak ada yang disebutkan di sini. Saya tidak tahu mengapa jawaban ini diturunkan karena ini adalah cara untuk membuat objek yang memiliki nilai berbeda dari representasi json atau konsol. Saya tidak tahu itu ada sampai saya mengungkapnya dalam jawaban yang berbeda, dan saya pikir jawaban ini harus terangkat karena itu adalah titik untuk mempertimbangkan dengan jenis masalah ini.
Rick Love
Mempertimbangkan jumlah jawaban yang benar-benar 0 poin, saya pikir seseorang baru saja melakukan downvoting semuanya.
emote_control
0

Saya menghadapi masalah yang sama hari ini. Dalam kasus saya kunci-kunci itu bersarang, yaitu key1.key2. Saya membagi kunci menggunakan split () dan kemudian menggunakan notasi braket persegi, yang berhasil bagi saya.

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

Saya membagi kunci dan menggunakannya seperti ini, data [key1] [key2] yang melakukan pekerjaan untuk saya.

GIGI
sumber
0

Saya memiliki masalah yang sama hari ini. Masalah disebabkan oleh uglify-js. Setelah saya mengeksekusi masalah kode non-uglified yang sama diselesaikan. Menghapus dari

--mangle-props

dari uglify-js cukup untuk menjalankan kode uglified.

Mungkin, praktik terbaik adalah menggunakan beberapa awalan untuk properti yang harus dikacaukan dengan aturan regex untuk uglify-js.

Inilah sumbernya:

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

dan di sini adalah bagaimana itu diperlihatkan:

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

Tidak satu pun dari JSON strify / parse yang berfungsi untuk saya.

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

Saya ingin nilai formValues.myKeydan apa triknya adalah setTimeout 0 seperti pada contoh di bawah ini. Semoga ini bisa membantu.

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

Saya baru saja mengalami masalah ini, dan singkatnya API saya mengembalikan tipe string dan bukan JSON. Jadi itu terlihat persis sama ketika Anda mencetaknya ke log namun setiap kali saya mencoba mengakses properti itu memberi saya kesalahan yang tidak ditentukan.

Kode API:

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

sebelumnya saya baru saja kembali:

return Json(string Of object);
Zapnologica
sumber
0

Saya memiliki masalah yang sama hari ini di React. Akhirnya menyadari bahwa masalah itu disebabkan oleh negara yang belum ditetapkan. Saya menelepon user.user.namedan meskipun itu muncul di konsol, saya tidak bisa mengaksesnya di komponen saya sampai saya menyertakan cek untuk memeriksa apakah user.usersudah diatur dan kemudian menelepon user.user.name.

Efiwe
sumber