Không thể truy cập thuộc tính đối tượng, mặc dù nó xuất hiện trong nhật ký giao diện điều khiển


329

Dưới đây, bạn có thể thấy đầu ra từ hai bản ghi này. Đầu tiên hiển thị rõ ràng đối tượng đầy đủ với thuộc tính mà tôi đang cố truy cập, nhưng trên dòng mã tiếp theo, tôi không thể truy cập nó với config.col_id_3(xem "không xác định" trong ảnh chụp màn hình?). Bất cứ ai có thể giải thích điều này? Tôi có thể có quyền truy cập vào tất cả các tài sản khác ngoại trừ field_id_4là tốt.

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

Đây là những gì những dòng này in trong Bảng điều khiển

Bảng điều khiển đầu ra


6
bạn có thể thử console.log(JSON.stringify(config));ans chia sẻ o / p
Arun P Johny

2
cũng thử điều này, nếu điều này hoạt động console.log (config ['col_id_3']);
zzlalani

5
Điều này làm việc cho tôi. sử dụng đầu ra được xâu chuỗi làm đầu vào mới cho một đối tượng làm việc: JSON.parse (JSON.opesify (obj))
Tope

2
Chuỗi và sau đó phân tích cú pháp đã không giải quyết vấn đề cho tôi, vì một số lý do. Tuy nhiên phân tích hoàn toàn đã làm. JSON.parse(obj)
JacobPariseau

3
Vì một số lý do, tất cả các câu trả lời giải thích cách đăng nhập đối tượng mà không cần khóa, không phải cách truy cập khóa
remidej

Câu trả lời:


296

Đầu ra của console.log(anObject)là sai lệch; trạng thái của đối tượng được hiển thị chỉ được giải quyết khi bạn mở rộng >bảng điều khiển. Nó không phải là trạng thái của đối tượng khi bạn console.loglà đối tượng.

Thay vào đó, hãy thử console.log(Object.keys(config)), hoặc thậm chí console.log(JSON.stringify(config))và bạn sẽ thấy các phím hoặc trạng thái của đối tượng tại thời điểm bạn gọi console.log.

Bạn sẽ (thường) tìm thấy các phím đang được thêm sauconsole.log cuộc gọi của bạn .


11
Hành vi này là một lỗi hoặc một tính năng? Nếu đó là một tính năng, lý do đằng sau nó là gì?
ESR

2
Làm thế nào để một người có được xung quanh này sau đó? Đặt thời gian chờ dường như KHÔNG phải là một giải pháp tốt.
Sahand

9
Vậy thì làm thế nào chúng ta có thể truy cập vào tài sản này, từ đối tượng?
Rohit Sharma

Để làm rõ, hành vi của >nút có khác nhau hay không tùy thuộc vào việc một mảng đang được mở rộng hay một đối tượng?
Flimm

Thực hiện một số thử nghiệm, có vẻ như bạn đã gặp phải vấn đề này ngay cả với một mảng, vì vậy tôi khuyên bạn nên thực hiện JSON.opesify thay thế.
Flimm

61

Tôi vừa gặp vấn đề này với một tài liệu được tải từ MongoDB bằng Mongoose .

Khi chạy console.log()trên toàn bộ đối tượng, tất cả các trường tài liệu (như được lưu trữ trong db) sẽ hiển thị. Tuy nhiên, một số người truy cập tài sản cá nhân sẽ trở lại undefined, khi những người khác (bao gồm _id) hoạt động tốt.

Hóa ra các bộ truy cập thuộc tính chỉ hoạt động cho các trường được chỉ định trong mongoose.Schema(...)định nghĩa của tôi , trong khi đó console.log()JSON.stringify()trả về tất cả các trường được lưu trữ trong db.

Giải pháp (nếu bạn đang sử dụng Mongoose) : đảm bảo tất cả các trường db của bạn được xác định trong mongoose.Schema(...).


Giải thích tuyệt vời về vấn đề này, tôi cho rằng Mongoose sẽ cho phép tôi truy vấn json mà không cần lược đồ (trong một tập lệnh bên ngoài), nhưng sẽ ngăn việc ghi. Nó dường như hoạt động vì _id có mặt và console.log nói rằng mọi thứ khác sẽ có thể truy cập được, nhưng không phải. Kỳ quái.
bstar

6
Hóa ra tôi đã thấy điều này bởi vì JSON.stringify()(và Node console.log()) thay đổi hành vi của họ nếu đối tượng được cung cấp có .toJSON()chức năng. Đầu ra bạn thấy là những gì .toJSON()trả về, và không phải là đối tượng ban đầu. Mongoose cung cấp cho bạn các đối tượng mô hình với một đối tượng .toJSON()cung cấp đối tượng db bên dưới. Đối tượng mô hình chỉ có các hàm truy cập cho các trường bạn xác định trong lược đồ, nhưng sau đó tất cả các trường db xuất hiện khi bạn đăng nhập nó vì bạn thực sự thấy đối tượng bên dưới được trả về .toJSON().
ramin

Tại sao cầy mangut không cho phép đọc các thuộc tính khác mà bạn có ý tưởng gì không?
Kannan T

Điều này hữu ích cho tôi khi tải CSV lên mongodb và tìm nạp tài sản. Hãy chắc chắn rằng tên của bạn phù hợp. Câu trả lời tuyệt vời cảm ơn bạn.
9BallOnTheSnap

1
Cảm ơn vì điều này. Tôi phát điên khi nhìn thấy nó trong bảng điều khiển và không thể truy cập nó. Đã thêm giá trị vào lược đồ của tôi và tôi tốt để đi. Cảm ơn một lần nữa!
alittletf

27

Kiểm tra xem bên trong đối tượng có một mảng các đối tượng. Tôi gặp vấn đề tương tự với JSON:

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

Tôi đã cố truy cập khóa 'tên' từ 'danh mục' và tôi đã gặp lỗi không xác định , vì tôi đang sử dụng:

var_name = obj_array.terms.category.name

Sau đó, tôi nhận ra rằng nó có dấu ngoặc vuông, điều đó có nghĩa là nó có một mảng các đối tượng bên trong khóa danh mục, bởi vì nó có thể có nhiều hơn một đối tượng thể loại. Vì vậy, để có được khóa 'tên' tôi đã sử dụng:

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

Và đó là mẹo.

Có lẽ đã quá muộn cho câu trả lời này, nhưng tôi hy vọng ai đó có cùng vấn đề sẽ tìm thấy điều này như tôi đã làm trước khi tìm Giải pháp :)


23

Tôi gặp vấn đề tương tự. Giải pháp cho tôi là sử dụng đầu ra được xâu chuỗi làm đầu vào để phân tích cú pháp JSON. Điều này làm việc cho tôi. hy vọng nó hữu ích cho bạn

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

2
Vâng, nó đã làm việc, nhưng tại sao điều này là bắt buộc? Tôi đã có JSON, tại sao tôi cần phải làm điều này?
jain

@dilpeshjain Tôi không chắc lắm, nhưng tôi sẽ mạo hiểm rằng chúng tôi chưa thực sự có JSON (có lẽ có một kịch bản loại tải lười biếng đang diễn ra, tôi không đủ hiểu biết về điều đó vào lúc này), nhưng vượt qua bất cứ điều gì chúng tôi có vào JSON.opesify yêu cầu trả về một chuỗi (như nhu cầu cuộc gọi console.log để in). Bởi vì tôi biết tôi ít nhất có thể có được một chuỗi, sau đó tôi có thể sử dụng chuỗi đó để tạo một đối tượng JSON ngay lập tức.
Tope

4
@jain bạn cần điều này vì javascript là một ngôn ngữ khủng khiếp

22

Tài sản bạn đang cố gắng truy cập có thể chưa tồn tại. Console.log hoạt động vì nó thực thi sau một độ trễ nhỏ, nhưng đó không phải là trường hợp còn lại của mã của bạn. Thử cái này:

var a = config.col_id_3;    //undefined

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

}, 100);

1
Tôi đã sử dụng phương thức onload để lấy các giá trị đối tượng của mình. Nhưng lần đầu tiên tôi vẫn không xác định được ngôn ngữ này .. Ngôn ngữ này khiến tôi chết từng ngày
Teoman Tıngır

một giải pháp dễ dàng là thực hiện lời hứa của người theo dõi để kiểm tra xem thuộc tính mong muốn có được xác định bằng setTimeout hay không và giải quyết + xóa thời gian chờ khi tài sản có sẵn.
Lai Xue

Ồ Trong 15 năm lập trình web của tôi, tôi chưa bao giờ gặp phải điều này và chưa bao giờ nghĩ về cách hoạt động của nhật ký giao diện điều khiển. Câu trả lời của bạn đã giúp xóa một số điều đó lên.
Kai Qing

12

Trong trường hợp của tôi, tôi đã chuyển một đối tượng cho một lời hứa, trong lời hứa tôi đã thêm nhiều khóa / giá trị cho đối tượng và khi nó được thực hiện, lời hứa đã trả lại đối tượng.

Tuy nhiên, nhìn qua phần của tôi, lời hứa đã trả lại đối tượng trước khi nó hoàn thành ... do đó phần còn lại của mã của tôi đang cố xử lý đối tượng được cập nhật và dữ liệu vẫn chưa có. Nhưng giống như trên, trong bảng điều khiển, tôi thấy đối tượng được cập nhật đầy đủ nhưng không thể truy cập các phím - chúng sẽ quay trở lại không xác định. Cho đến khi tôi thấy điều này:

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] là một biểu tượng nhỏ, khi tôi di chuột qua nó nói Object value at left was snapshotted when logged, value below was evaluated just now. Đó là khi tôi nhận ra rằng đối tượng của tôi đã được đánh giá trước khi lời hứa đã cập nhật đầy đủ.


10

Tôi đã đấu tranh với vấn đề này ngày hôm nay và nghĩ rằng tôi sẽ để lại câu trả lời với giải pháp của mình.

Tôi đã tìm nạp một đối tượng dữ liệu thông qua ajax, đại loại như thế này: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

Giả sử đối tượng này nằm trong một biến gọi là dữ liệu. Bất cứ khi nào tôi tham khảo data.i18ntôi đã nhận được undefined.

  1. console.log(data) cho thấy các đối tượng như mong đợi
  2. console.log(Object.keys(data))nói ["constants","i18n"]như mong đợi
  3. Đổi tên i18n thành inter không thay đổi gì cả
  4. Tôi thậm chí đã cố gắng chuyển đổi dữ liệu để biến "i18n" thành đối tượng đầu tiên
  5. Đã di chuyển mã xung quanh để đảm bảo chắc chắn đối tượng đã được thiết lập hoàn toàn và không có vấn đề gì với lời hứa ajax.

Không có gì giúp được ... Sau đó, về phía máy chủ, tôi đã viết dữ liệu vào nhật ký php và nó đã tiết lộ điều này:

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

Chữ "i" trong khóa chỉ mục thực sự là u0456 (cyrillic i). Điều này không thể nhìn thấy trong trình soạn thảo php của tôi hoặc nhật ký bảng điều khiển trình duyệt. Chỉ có nhật ký php tiết lộ điều này ... Đó là một điều khó khăn ...


1
Đây cũng là vấn đề của tôi; thay vào đó, có một ký tự Cyrillic 'c' trong một số trường hợp. Tôi tìm thấy nó bằng cách tìm kiếm tập tin của tôi cho chuỗi tôi mong đợi; người đáng ngờ đã không được chọn, vì vậy điều đó cho tôi biết có một nhân vật sai lầm không thể nhìn thấy trước mắt.
thợ đan

Câu trả lời này thực sự đã giúp tôi tìm ra giải pháp của mình. Vấn đề của tôi là tôi đã viết sai tên biến. Tôi đã "udpate" thay vì "cập nhật" lol
Savlon

8

Dữ liệu của tôi chỉ là chuỗi dữ liệu json. (Biến này được lưu dưới dạng chuỗi json trong phiên).

console.log(json_string_object)

-> chỉ trả về đại diện của chuỗi này và không có cách nào để tạo sự khác biệt cho dù đó là chuỗi hay đối tượng.

Vì vậy, để làm cho nó hoạt động tôi chỉ cần chuyển đổi nó trở lại đối tượng thực sự:

object = JSON.parse(json_string_object);

Đây là câu trả lời duy nhất có hiệu quả với tôi và cũng được đề cập trong các bình luận của câu hỏi ban đầu, điều này nên cao hơn.
abagh0703

5

Năm 2018 Mozilla cảnh báo chúng tôi trong Mozilla Docs tại đây !

Tôi trích dẫn "Ghi nhật ký đối tượng" :

Đừng sử dụng console.log(obj);, sử dụng console.log(JSON.parse(JSON.stringify(obj)));.

Bằng cách này, bạn chắc chắn rằng bạn đang thấy giá trị của obj tại thời điểm bạn đăng nhập nó.


4

Điều này có thể giúp ai đó khi tôi gặp vấn đề tương tự trong đó JSON.parse () đang trả về một đối tượng mà tôi có thể in trên console.log () nhưng tôi không thể xử lý các trường cụ thể và không có giải pháp nào ở trên hoạt động được tôi. Giống như sử dụng kết hợp JSON.parse () với JSON.opesify ().

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  

Tôi đã kết thúc việc giải quyết vấn đề bằng cách sử dụng một trình phân tích cú pháp khác được cung cấp bởi ExtJs Ext.decode ();

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

2

Trong trường hợp của tôi, điều đó xảy ra là mặc dù tôi nhận được dữ liệu ở định dạng của một mô hình giống như myMethod(data:MyModelClass) đối tượng cho đến khi đối tượng nhận được thuộc kiểu chuỗi. Đó là y trong console.log (dữ liệu) tôi nhận được nội dung. Giải pháp chỉ là phân tích JSON (trong trường hợp của tôi)

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

Suy nghĩ có thể hữu ích.


2

Tôi vừa gặp phải sự cố này với các đối tượng được tạo bởi trình phân tích cú pháp csv từ tệp CSV được tạo bởi MS Excel. Tôi đã có thể truy cập tất cả các thuộc tính ngoại trừ thuộc tính đầu tiên - nhưng nó sẽ hiển thị ổn nếu tôi viết toàn bộ đối tượng bằng console.log.

Hóa ra định dạng CSV UTF-8 chèn 3 byte (ef bb bf) khi bắt đầu tương ứng với một ký tự vô hình - được bao gồm như một phần của tiêu đề thuộc tính đầu tiên bởi trình phân tích cú pháp csv. Giải pháp là tạo lại CSV bằng tùy chọn không phải UTF và điều này đã loại bỏ ký tự vô hình.


Bạn là một anh hùng! Cảm ơn đã đăng bài này. Tôi đang kéo tóc ra.
Jordan S

Cảm ơn một lần nữa cho đăng bài này! Cứu đêm của tôi!
Oliver Hickman

2

Tôi đã có vấn đề tương tự, hy vọng giải pháp sau đây sẽ giúp được ai đó.
Bạn có thể sử dụng setTimeoutchức năng như một số kẻ ở đây gợi ý, nhưng bạn không bao giờ biết chính xác trình duyệt của bạn cần bao lâu để xác định đối tượng của bạn.

setIntervalThay vào đó tôi đề nghị sử dụng chức năng thay thế. Nó sẽ đợi cho đến khi đối tượng của bạn config.col_id_3được xác định và sau đó kích hoạt phần mã tiếp theo yêu cầu các thuộc tính đối tượng cụ thể của bạn.

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

Tôi đã có cùng một vấn đề và không có giải pháp nào ở trên làm việc cho tôi và nó có cảm giác như đoán công việc sau đó. Tuy nhiên, việc bọc mã của tôi để tạo đối tượng trong setTimeouthàm đã tạo ra mánh khóe cho tôi.

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

Tôi đã có một vấn đề tương tự hoặc có thể chỉ liên quan.

Đối với trường hợp của tôi, tôi đã truy cập các thuộc tính của một đối tượng nhưng không xác định được. Tôi thấy vấn đề là một khoảng trắng trong mã phía máy chủ trong khi tạo khóa, val của đối tượng.

Cách tiếp cận của tôi như sau ...

tạo đối tượng của tôi ... chú ý khoảng trắng trong "word"

phản hồi tôi nhận được từ API REST

mã javascript để đăng nhập các giá trị

đăng nhập kết quả từ bàn điều khiển

Sau khi xóa khoảng trắng khỏi mã phía máy chủ tạo đối tượng, giờ tôi có thể truy cập thuộc tính như bên dưới ...

kết quả sau khi loại bỏ khoảng trắng

Đây có thể không phải là vấn đề với trường hợp của câu hỏi chủ đề nhưng là cho trường hợp của tôi và có thể là như vậy đối với một số người khác. Hy vọng nó giúp.


1

Tôi cũng gặp vấn đề tương tự với một tài liệu được tải từ MongoDB bằng Mongoose.

Hóa ra tôi đang sử dụng tài sản find()để trả lại chỉ là một đối tượng, vì vậy tôi đã thay đổi find()đến findOne()và tất cả mọi thứ đã làm việc cho tôi.

Giải pháp (nếu bạn đang sử dụng Mongoose): Đảm bảo chỉ trả về một đối tượng, vì vậy bạn có thể phân tích cú pháp của nó object.idhoặc nó sẽ được coi là một mảng vì vậy bạn cần phải xác nhận nó như thế object[0].id.


1

Đối với tôi, nó hóa ra là một vấn đề liên quan đến Mongoose.

Tôi đã lặp qua các đối tượng mà tôi nhận được từ truy vấn Mongo. Tôi chỉ phải xóa:

items = await Model.find()

Và thay thế nó bằng:

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

0

Tôi gặp vấn đề như thế này và thấy giải pháp là phải làm với Underscore.js. Ghi nhật ký ban đầu của tôi không có ý nghĩa:

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

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

console.log(obj.code);

> undefined

Tôi tìm thấy giải pháp bằng cách cũng nhìn vào các phím của đối tượng:

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

> ["_wrapped","_chain"]

Điều này khiến tôi nhận ra rằng đó objthực sự là một trình bao bọc Underscore.js xung quanh một đối tượng và việc gỡ lỗi ban đầu đang nói dối tôi.


0

Tôi gặp vấn đề tương tự (khi phát triển cho SugarCRM), nơi tôi bắt đầu với:

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

Vấn đề là ở đó fetch(), cuộc gọi không đồng bộ của nó vì vậy tôi phải viết lại mã của mình thành:

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

Chỉ trong trường hợp điều này hữu ích cho ai đó, tôi đã gặp vấn đề tương tự và đó là do ai đó đã tạo một ghi đè cho .toJSON trong đối tượng tôi đang làm việc. Vì vậy, đối tượng là một cái gì đó như:

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

Nhưng .toJSON () là:

toJSON() {
  return this.foo
}

Vì vậy, khi tôi gọi JSON.opesify (myObject), nó trả về "{" bar ":" Xin chào "," baz ":" World "}". Tuy nhiên, Object.keys (myObject) đã tiết lộ "foo".


toJson()đây là điểm mà không ai đề cập ở đây Tôi không biết lý do tại sao câu trả lời này bị hạ cấp vì đây là cách để tạo một đối tượng có giá trị khác với biểu diễn json hoặc bảng điều khiển. Tôi không biết nó tồn tại cho đến khi tôi phát hiện ra nó trong một câu trả lời khác và tôi nghĩ rằng câu trả lời này nên được nêu lên vì đây là một điểm cần xem xét với các loại vấn đề này.
Rick Yêu

Xem xét số lượng câu trả lời có chính xác 0 điểm, tôi nghĩ ai đó vừa trải qua mọi thứ.
emote_control

0

Tôi đã đối mặt với cùng một vấn đề ngày hôm nay. Trong trường hợp của tôi, các khóa được lồng nhau, tức là key1.key2. Tôi chia các khóa bằng cách sử dụng split () và sau đó sử dụng ký hiệu dấu ngoặc vuông, hoạt động với tôi.

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

Tôi chia các khóa và sử dụng nó như thế này, dữ liệu [key1] [key2] đã làm công việc cho tôi.


0

Tôi đã có cùng một vấn đề ngày hôm nay. Vấn đề được gây ra bởi uglify-js. Sau khi tôi thực hiện cùng một vấn đề mã không xấu xí đã được giải quyết. Loại bỏ

--mangle-props

từ uglify-js là đủ để làm việc mã xấu.

Có lẽ, cách tốt nhất là sử dụng một số tiền tố cho các thuộc tính phải được xử lý bằng quy tắc regex cho uglify-js.

Đây là nguồn:

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

và đây là cách nó bị làm xấu đi:

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

0

Không có chuỗi JSONify / parse nào làm việc cho tôi.

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

Tôi muốn giá trị của formValues.myKeyvà cái gì đã lừa là setTimeout 0 như trong ví dụ dưới đây. Hy vọng nó giúp.

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

0

Tôi cũng gặp phải vấn đề này và câu chuyện dài API của tôi đã trả về một kiểu chuỗi chứ không phải JSON. Vì vậy, nó trông giống hệt như khi bạn in nó vào nhật ký tuy nhiên bất cứ khi nào tôi cố gắng truy cập vào các thuộc tính, nó đã cho tôi một lỗi không xác định.

Mã API:

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

trước đây tôi mới trở về:

return Json(string Of object);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.