콘솔 로그에 표시 되어도 개체 속성에 액세스 할 수 없습니다


329

아래에서이 두 로그의 출력을 볼 수 있습니다. 첫 번째는 액세스하려는 속성이있는 전체 객체를 명확하게 보여 주지만 다음 코드 줄에서는 액세스 할 수 없습니다 config.col_id_3(스크린 샷의 "정의되지 않음"을 참조하십시오). 누구든지 이것을 설명 할 수 있습니까? 나는 이외의 다른 모든 재산에 접근 할 수 있습니다 field_id_4.

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

이것이 콘솔 에서이 줄을 인쇄하는 것입니다.

콘솔 출력


6
A console.log(JSON.stringify(config));/ P 공유
Arun P Johny

2
만약 작동한다면 console.log (config [ 'col_id_3']);
zzlalani

5
이것은 나를 위해 일했습니다. 작업 객체에 대한 새로운 입력으로 문자열 출력을 사용 : JSON.parse (JSON.stringify (obj))
Tope

2
어떤 이유로 든 문자열 화하고 구문 분석해도 문제가 해결되지 않았습니다. 그러나 파싱은 옳았습니다. JSON.parse(obj)
JacobPariseau

3
어떤 이유로 모든 해답은 키에 액세스하는 방법, 키없이 객체를하지 로그인하는 방법을 설명
remidej

답변:


296

의 결과 console.log(anObject)는 잘못된 것입니다. 표시된 개체의 상태 >는 콘솔에서 콘솔 을 확장 할 때만 해결됩니다 . 객체를 객체로 만들 때의 객체 상태 가 아닙니다console.log .

대신 console.log(Object.keys(config))또는을 시도 console.log(JSON.stringify(config))하면 호출 할 때 키 또는 객체의 상태가 표시 console.log됩니다.

당신은 (보통) 키가 추가되고있다 찾을 귀하의 console.log전화.


11
이 동작은 버그입니까 아니면 기능입니까? 기능인 경우 그 이유는 무엇입니까?
ESR

2
그러면이 문제를 어떻게 해결할 수 있습니까? 시간 초과를 설정하는 것은 좋은 해결책처럼 보이지 않습니다.
사한

9
그러면 객체에서 어떻게이 속성에 액세스 할 수 있습니까?
Rohit Sharma

명확히하기 위해 >배열의 확장 여부 또는 객체에 따라 버튼 의 동작이 달라 집니까?
Flimm

몇 가지 테스트를 수행하면 배열 에서도이 문제가 발생하는 것으로 보이므로 대신 JSON.stringify를 사용하는 것이 좋습니다.
Flimm

62

Mongoose를 사용하여 MongoDB에서로드 된 문서 에서이 문제가 발생했습니다 .

console.log()전체 객체에서 실행될 때 모든 문서 필드 (db에 저장된)가 나타납니다. 그러나 일부 개인 자산 접근 undefined자는을 (를 포함하여 _id) 다른 사람이 제대로 작동 하면을 반환 합니다.

속성 접근이 만 내에서 지정된 필드 작동 밝혀졌다 mongoose.Schema(...)반면 정의, console.log()그리고 JSON.stringify()모든 필드가 DB에 저장된 돌아갑니다.

솔루션 (Mongoose를 사용하는 경우) : 모든 DB 필드가에 정의되어 있는지 확인하십시오 mongoose.Schema(...).


이 문제에 대한 훌륭한 설명은 Mongoose가 스키마없이 외부 스크립트에서 json을 쿼리 할 수는 있지만 쓰기는 막을 것이라고 생각했습니다. _id가 존재하고 console.log는 다른 모든 것에 액세스 할 수 있어야하지만 액세스 할 수는 없기 때문에 작동하는 것으로 보입니다. 기괴한.
bstar

7
주어진 객체에 함수 가있는 경우 JSON.stringify()(및 Node 's console.log())의 동작이 변경 되기 때문에 이것을 보았습니다 .toJSON(). 표시되는 결과 .toJSON()는 원래 개체 가 아니라 반환 되는 결과 입니다. Mongoose는 .toJSON()기본 db 객체를 제공하는 모델 객체 를 제공합니다. 모델 객체는 스키마에서 정의한 필드에 대한 접근 자만 가지고 있지만 실제로는 기본 객체가에서 반환 한 것을 볼 수 있기 때문에 모든 db 필드를 기록 할 때 나타납니다 .toJSON().
ramin

몽구스가 다른 속성을 읽을 수없는 이유는 무엇입니까?
Kannan T

이것은 mongodb에 CSV를 업로드하고 속성을 가져올 때 도움이되었습니다. 이름이 일치하는지 확인하십시오. 큰 답변 감사합니다.
9BallOnTheSnap

1
감사합니다. 나는 콘솔에서 그것을보고 액세스 할 수 없다는 것에 화를 냈습니다. 내 스키마에 값을 추가했으며 계속 진행할 수 있습니다. 다시 감사합니다!
alittletf

27

객체 내부에 객체 배열이 있는지 확인하십시오. JSON과 비슷한 문제가있었습니다.

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

'category'에서 'name'키에 액세스하려고했는데 다음을 사용하고 있기 때문에 정의되지 않은 오류가 발생했습니다.

var_name = obj_array.terms.category.name

그런 다음 대괄호가 있음을 깨달았습니다. 즉, 카테고리 키 안에 객체 배열이 있음을 의미합니다. 하나 이상의 카테고리 객체를 가질 수 있기 때문입니다. 따라서 'name'키를 얻으려면 이것을 사용했습니다.

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

그리고 그 트릭을 수행합니다.

어쩌면이 답변에 너무 늦었을 수도 있지만 같은 문제가있는 사람이 해결책을 찾기 전에 내가했던 것처럼 이것을 찾을 수 있기를 바랍니다. :)


23

나는 같은 문제가 있었다. 나를위한 솔루션은 JSON을 구문 분석하기위한 문자열 출력을 입력으로 사용하고있었습니다. 이것은 나를 위해 일했습니다. 그게 당신에게 유용한 희망

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

2
예, 작동했지만 왜 이것이 필요한가요? 이미 JSON이 있는데 왜 이것을해야합니까?
jain

@dilpeshjain 정확히 확실하지는 않지만 실제로 JSON이 실제로 존재하지 않는다고 생각합니다 (아마도 지연 로딩 유형 시나리오가 진행 중입니다. 현재 그에 대해 충분히 알지 못합니다). JSON.stringify에 문자열을 반환해야합니다 (예 : console.log 호출 인쇄 필요) 적어도 문자열을 얻을 수 있다는 것을 알고 있으므로 해당 문자열을 사용하여 JSON 객체를 즉시 만들 수 있습니다.
Top

4
자바 스크립트는 끔찍한 언어이기 때문에이 필요 @jain

22

액세스하려는 속성이 아직 존재하지 않을 수 있습니다. Console.log는 약간의 지연 후에 실행되기 때문에 작동하지만 나머지 코드에는 해당되지 않습니다. 이 시도:

var a = config.col_id_3;    //undefined

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

}, 100);

1
객체 값을 얻기 위해 메소드를 온로드하는 데 사용했지만 여전히 처음에는 정의되지 않았습니다.이 언어는 날 죽게 만듭니다.
Teoman Tıngır

원하는 해결 방법은 원하는 속성이 setTimeout으로 정의되어 있는지 확인하고 속성을 사용할 수있게되면 시간 초과를 해결하는 감시자 약속을 구현하는 것입니다.
Lai Xue

와. 15 년 동안의 웹 프로그래밍에서이 문제를 경험 한 적이 없으며 콘솔 로그 작동 방식에 대해 전혀 생각하지 않았습니다. 당신의 대답은 그 중 일부를 지우는 데 도움이되었습니다.
카이 청

12

내 경우에는 약속에 객체를 전달하고 약속 내에서 객체에 더 많은 키 / 값을 추가하고 약속이 객체를 반환했습니다.

그러나 내 부분을 조금만 살펴보면 약속이 완전히 완료되기 전에 객체를 반환하는 것입니다 ... 따라서 나머지 코드는 업데이트 된 객체를 처리하려고 시도했지만 데이터가 아직 없었습니다. 그러나 위와 같이 콘솔에서 객체가 완전히 업데이트되었지만 키에 액세스 할 수 없었습니다. 정의되지 않은 상태로 돌아 왔습니다. 내가 이것을 볼 때까지 :

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. 약속이 그것을 완전히 업데이트하기 전에 내 객체가 평가되고있는 것이 나에게 일어난 일입니다.


10

오늘이 문제로 어려움을 겪고 솔루션에 대한 답변을 남기겠다고 생각했습니다.

나는 아약스를 통해 데이터 객체를 가져오고 있었다. {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

이 객체가 data라는 변수에 있다고 가정 해 봅시다. 내가 참조 할 때마다 나는 data.i18n얻었다 undefined.

  1. console.log(data) 예상대로 물건을 보여
  2. console.log(Object.keys(data))["constants","i18n"]예상대로 말했다
  3. 이름 바꾸기 국제화를간 것은 아무것도 변경하지 않았다
  4. "i18n"을 첫 번째 객체로 만들기 위해 데이터를 전환하려고했습니다.
  5. 객체가 완전히 설정되었으며 아약스 약속에 아무런 문제가 없도록 절대 코드를 이동했습니다.

아무것도 도움이되지 못했습니다 ... 그런 다음 서버 측에서 데이터를 PHP 로그에 기록하고 다음을 공개했습니다.

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

인덱스 키의 "i"는 실제로 u0456 (키릴 i)입니다. 내 PHP 편집기 또는 브라우저 콘솔 로그에 표시되지 않았습니다. PHP 로그만이 이것을 공개했습니다 ... 그것은 까다로운 것입니다 ...


1
이것은 또한 내 문제였습니다. 일부 경우에 키릴 문자 'c'가 대신 사용되었습니다. 예상 한 문자열을 파일에서 검색하여 찾았습니다. 의심스러운 사람은 선택되지 않았으므로 눈에 보이지 않는 잘못된 인물이 있다고 말했습니다.
knighter

이 답변은 실제로 내 솔루션을 찾는 데 도움이되었습니다. 내 문제는 변수 이름의 철자가 틀렸다는 것입니다. "update"대신 "udpate"lol
Savlon

8

내 데이터는 단지 json 데이터 문자열이었습니다. (이 변수는 세션에서 json 문자열로 저장되었습니다).

console.log(json_string_object)

->는이 문자열의 표현 만 반환하며 문자열이든 객체이든 차이를 만들 방법이 없습니다.

그래서 그것을 작동 시키려면 실제 객체로 다시 변환해야했습니다.

object = JSON.parse(json_string_object);

이것은 나를 위해 일한 유일한 대답 였고 원래 질문의 의견에도 언급되어 있습니다.
abagh0703

5

2018 년에 Mozilla는 Mozilla Docs 에서 경고 합니다 !

"Logging Objects"를 인용합니다 .

사용하지 마십시오 console.log(obj);, 사용 console.log(JSON.parse(JSON.stringify(obj)));.

이 방법으로 로그하는 순간 obj 값을 볼 수 있습니다.


4

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

2

내 경우 myMethod(data:MyModelClass) 에는 수신 된 객체가 문자열 유형이 될 때까지 객체 와 같은 모델 형식으로 데이터를 수신하더라도 마찬가지 입니다. console.log (data)에서 y는 내용입니다. 해결책은 JSON을 구문 분석하는 것입니다 (제 경우에는)

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

생각이 유용 할 수 있습니다.


2

방금 MS Excel에서 생성 된 CSV 파일에서 csv-parser로 생성 된 객체 에서이 문제가 발생했습니다. 첫 번째 속성을 제외한 모든 속성에 액세스 할 수 있었지만 console.log를 사용하여 전체 객체를 작성하면 정상적으로 표시됩니다.

UTF-8 CSV 형식은 csv-parser에 의해 첫 번째 속성 헤더의 일부로 포함 된 보이지 않는 문자에 해당하는 시작에 3 바이트 (ef bb bf)를 삽입한다는 것이 밝혀졌습니다. 해결책은 비 UTF 옵션을 사용하여 CSV를 다시 생성하는 것이므로 보이지 않는 문자가 제거되었습니다.


당신은 영웅입니다! 이것을 게시 해 주셔서 감사합니다. 나는 머리를 뽑고 있었다.
Jordan S

이것을 게시 해 주셔서 감사합니다. 내 밤을 구했다!
올리버 히크

2

비슷한 문제가 있었으므로 다음 솔루션이 누군가를 돕기를 바랍니다. 여기에서 제안하는 것처럼 함수를
사용할 수 setTimeout있지만 브라우저가 객체를 정의하는 데 얼마나 오래 걸리는지 알 수 없습니다.

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

TYPESCRIPT및 / 또는를 사용하는 경우 ANGULAR이것이 될 수 있습니다!

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

에 응답 유형을 설정 어느 날 위해 고정이 문제를 내가 응답에 액세스 속성은 내가 설정할 수 없습니다 때까지 입술을 : 어떤

이 질문보기 '_body'속성'Response'유형에 없습니다.


1

나는 같은 문제가 있었고 위의 해결책이 나를 위해 효과가 없었으며 그 이후에는 추측 작업과 같은 느낌이 들었습니다. 그러나 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

비슷한 문제가 있거나 관련이있을 수 있습니다.

필자의 경우 객체의 속성에 액세스했지만 정의되지 않았습니다. 문제는 키, 객체의 키를 만드는 동안 서버 측 코드의 공백입니다.

내 접근 방식은 다음과 같습니다 ...

내 개체 만들기 ... "word"에서 공백을 확인하십시오.

REST API에서 얻은 응답

값을 기록하는 자바 스크립트 코드

콘솔에서 로그 결과

객체를 생성하는 서버 측 코드에서 공백을 제거한 후 이제 아래와 같이 속성에 액세스 할 수 있습니다 ...

공백을 제거한 후의 결과

이것은 주제 질문의 경우 문제가 아닐 수 있지만 내 경우에 대한 것일 수도 있고 다른 경우에도있을 수 있습니다. 도움이 되길 바랍니다.


1

Mongoose를 사용하여 MongoDB에서로드 된 문서와 동일한 문제가 있습니다.

내가 속성을 사용하고 있다고 밝혀졌다 find()내가 변경, 그래서 하나의 개체를 반환 find()findOne()모든 것이 나를 위해 일했다.

해결책 (Mongoose를 사용하는 경우) : 하나의 객체 만 반환해야 구문 분석 할 수 있습니다. 그렇지 않으면 객체 object.id가 배열로 취급되므로 그렇게해야합니다 object[0].id.


1

나를 위해 그것은 몽구스 관련 문제로 밝혀졌습니다.

Mongo 쿼리에서 얻은 객체를 반복했습니다. 방금 제거해야했습니다.

items = await Model.find()

그리고 그것을 다음으로 대체하십시오 :

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

0

나는 이와 같은 문제가 있었고 해결책은 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

비슷한 문제가 있었으며 (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

이것이 누군가에게 도움이되는 경우 비슷한 문제가 있었고 누군가 내가 작업하고있는 객체에서 .toJSON에 대한 재정의를 만들었 기 때문입니다. 따라서 객체는 다음과 같습니다.

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

그러나 .toJSON ()은 다음과 같습니다.

toJSON() {
  return this.foo
}

따라서 JSON.stringify (myObject)를 호출하면 "{"bar ":"Hello ","baz ":"World "}"가 반환되었습니다. 그러나 Object.keys (myObject)는 "foo"를 공개했습니다.


toJson()이것은 여기에 아무도 언급하지 않은 요점입니다. json 또는 콘솔 표현과 다른 값을 가진 객체를 만드는 방법이기 때문에이 답변이 왜 다운 투표되었는지 알 수 없습니다. 나는 다른 대답으로 그것을 발견 할 때까지 그것이 존재한다는 것을 몰랐고, 나는이 유형의 문제를 고려해야 할 시점이기 때문에이 대답은 공표되어야한다고 생각합니다.
Rick Love

정확히 0 점을 가진 답의 수를 고려하면 누군가가 모든 것을 하향 조정했다고 생각합니다.
emote_control

0

나는 오늘 같은 문제에 직면했다. 필자의 경우 키는 중첩되었습니다 (예 : key1.key2). split ()을 사용하여 키를 분할 한 다음 대괄호 표기법을 사용하여 저에게 효과적이었습니다.

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

나는 키를 나누고 이것을 사용했다. data [key1] [key2]는 나를 위해 일했다.


0

오늘도 같은 문제가있었습니다. 문제는 uglify-js로 인해 발생했습니다. 내가 수정되지 않은 동일한 코드 문제를 실행 한 후에 해결되었습니다. 제거

--mangle-props

uglify-js에서 작동하는 uglified 코드를 작성하기에 충분했습니다.

아마도 가장 좋은 방법은 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

JSON stringify / parse 중 어느 것도 나를 위해 일하지 않았습니다.

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

나는 formValues.myKey아래의 예에서와 같이 값을 원했고 트릭은 setTimeout 0이었습니다. 도움이 되길 바랍니다.

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

0

방금이 문제가 발생했으며 긴 이야기로 API가 JSON이 아닌 문자열 유형을 반환했습니다. 따라서 로그에 인쇄 할 때 정확히 똑같이 보였지만 속성에 액세스하려고 할 때마다 정의되지 않은 오류가 발생했습니다.

API 코드 :

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

이전에는 방금 돌아 왔습니다.

return Json(string Of object);

0

오늘 React에서도 비슷한 문제가 발생했습니다. 결과적으로 아직 설정되지 않은 상태로 인해 문제가 발생했음을 깨달았습니다. 전화 user.user.name를 걸었지만 콘솔에 표시되었지만 user.user설정 되어 있는지 확인한 다음 전화를 걸 때 확인을 포함시킬 때까지 구성 요소에서 액세스 할 수없는 것 같습니다 user.user.name.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.