コンソールログに表示されているにもかかわらず、オブジェクトプロパティにアクセスできない


329

以下に、これら2つのログの出力を示します。1つ目は、アクセスしようとしているプロパティを持つ完全なオブジェクトを明確に示していますが、コードの次の行ではアクセスできませんconfig.col_id_3(スクリーンショットの「undefined」を参照してください)。誰かがこれを説明できますか?他のすべてのプロパティにもアクセスできますfield_id_4

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

これは、これらの行がコンソールに印刷されるものです

コンソール出力


6
console.log(JSON.stringify(config));ansがo / pを共有してみてください
Arun Pジョニー2013

2
これが機能する場合は、console.log(config ['col_id_3']);も試してください。
zzlalani 2013

5
これでうまくいきました。文字列化された出力を作業オブジェクトの新しい入力として使用:JSON.parse(JSON.stringify(obj))
Tope

2
文字列化してから解析しても、何らかの理由で問題が解決しませんでした。しかし、完全に解析した。 JSON.parse(obj)
JacobPariseau 2017年

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
では、これをどうやって回避するのでしょうか?タイムアウトの設定は良い解決策のようには思えません。
Sahand 2018

9
次に、オブジェクトからこのプロパティにどのようにアクセスできますか?
Rohit Sharma

明確にするために、>ボタンの動作は、配列が展開されているのかオブジェクトが展開されているのかによって異なりますか?
Flimm

いくつかのテストを行うと、配列でもこの問題に遭遇したようですので、代わりにJSON.stringifyを実行することをお勧めします。
Flimm

62

Mongooseを使用してMongoDBからロードされたドキュメントでこの問題が発生しました

console.log()オブジェクト全体で実行すると、すべてのドキュメントフィールド(dbに保存されている)が表示されます。ただし、一部の個々のプロパティアクセサーはundefined_id)が正常に動作したます。

プロパティアクセサーは、私のmongoose.Schema(...)定義で指定されたフィールドに対してのみ機能し、dbに格納されているすべてのフィールドconsole.log()JSON.stringify()返すことがわかりました。

解決策(Mongooseを使用している場合):すべてのdbフィールドがで定義されていることを確認しますmongoose.Schema(...)


この問題の素晴らしい説明として、Mongooseではスキーマなしで(外部スクリプトで)jsonにクエリを実行できるが、書き込みはできないと考えました。_idが存在し、console.logが他のすべてにアクセス可能である必要があることを示しているため、機能しているようですが、そうではありません。奇妙な。
bstar

7
与えられたオブジェクトが関数を持っている場合、JSON.stringify()(そしてNodeのconsole.log())それらの振る舞いを変えるので、私はこれを見ていました.toJSON()。表示される出力.toJSON()は元のオブジェクトではなく、返されるものです。Mongooseは.toJSON()、基礎となるdbオブジェクトを提供するを使用してモデルオブジェクトを提供します。モデルオブジェクトには、スキーマで定義したフィールドのアクセサーしかありませんが、実際にによって返される基になるオブジェクトが表示されているため、ログに記録するとすべてのdbフィールドが表示され.toJSON()ます。
ラミン2016

mongooseが他のプロパティの読み取りを許可しないのはなぜですか?
Kannan T

これは、CSVをmongodbにアップロードしてプロパティを取得するときに役立ちました。名前が一致していることを確認してください。素晴らしい回答ありがとうございます。
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

次に、角かっこがあることに気付きました。つまり、複数のカテゴリオブジェクトを持つことができるため、カテゴリキー内にオブジェクトの配列があります。したがって、「名前」キーを取得するために、私はこれを使用しました:

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を持っていますが、なぜこれを行う必要があるのですか?
2016年

@dilpeshjain正確にはわかりませんが、実際にはJSONがまだないことを確認します(おそらく、遅延読み込みタイプのシナリオが発生しているため、現時点では十分な知識がありません)。 JSON.stringifyには、文字列を返す必要があります(印刷にはconsole.log呼び出しが必要です)。少なくとも文字列を取得できることはわかっているので、その文字列を使用してJSONオブジェクトをすぐに作成できます。
Tope

4
@jain javascriptは恐ろしい言語であるため、これが必要です

22

アクセスしようとしているプロパティはまだ存在していない可能性があります。Console.logは少し遅れて実行されるので機能しますが、それ以外のコードではそうではありません。これを試して:

var a = config.col_id_3;    //undefined

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

}, 100);

1
私はオブジェクトの値を取得するためにonloadメソッドを使用していました。しかし、まだ最初は未定義です。この言語により、私は日々死んでいます
TeomanTıngır2018年

簡単な解決策は、目的のプロパティがsetTimeoutで定義されているかどうかを確認し、プロパティが使用可能になるとタイムアウトを解決してクリアするウォッチャープロミスを実装することです。
Lai Xue

ワオ。私の15年間のWebプログラミングでは、これに遭遇したことはありませんでした。あなたの答えはそれのいくつかを明確にするのに役立ちました。
カイ清

12

私の場合、オブジェクトをpromiseに渡していました。promise内で、オブジェクトにキー/値を追加していました。完了すると、promiseがオブジェクトを返しました。

しかし、私の部分を少し見直すと、約束はオブジェクトが完全に完了する前にオブジェクトを返すことでした...そのため、残りのコードは更新されたオブジェクトを処理しようとして、データはまだありませんでした。しかし、上記のように、コンソールでは、オブジェクトが完全に更新されたのを見ましたが、キーにアクセスできませんでした-それらは未定義で戻ってきました。私がこれを見るまで:

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

今日、この問題に苦労しました。解決策を返答するつもりです。

私はajaxを介して次のようなデータオブジェクトをフェッチしていました: {"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}

このオブジェクトがデータと呼ばれる変数にあるとしましょう。私が参照したときはいつでも私data.i18nは得ましたundefined

  1. console.log(data) 期待通りにオブジェクトを示した
  2. console.log(Object.keys(data)) 前記 ["constants","i18n"]予想通り
  3. i18nの名前をinterに変更変更しても、何も変更されませんでした
  4. 「i18n」を最初のオブジェクトにするためにデータを切り替えようとしました
  5. オブジェクトが完全に設定され、ajax Promiseに問題がないことを確認するために、コードを移動しました。

何も役に立たなかった...次に、サーバー側でデータをphpログに書き込んだところ、次のように明らかになった。

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

インデックスキーの "i"は、実際にはu0456(キリル文字i)でした。これは私のphpエディターやブラウザーコンソールログに表示されませんでした。phpログだけがこれを明らかにしました...それはトリッキーなものでした...


1
これも私の問題でした。一部のインスタンスでは、代わりにキリル文字「c」の文字がありました。ファイルを検索して期待した文字列を見つけました。疑わしいものは選択されなかったので、目に見えない間違った性格があることがわかりました。
ナイター、

この回答は実際に私の解決策を見つけるのに役立ちました。私の問題は、変数名のスペルを間違えていたことでした。私は「更新」ではなく「更新」しましたlol
サブロン

8

私のデータは単なるjsonデータ文字列でした。(この変数はセッションでjson文字列として保存されました)。

console.log(json_string_object)

->この文字列の表現のみを返し、文字列であるかオブジェクトであるかを区別する方法はありません。

それでそれを機能させるために、私はそれを実際のオブジェクトに変換し直す必要がありました:

object = JSON.parse(json_string_object);

これは私にとって有効な唯一の回答であり、元の質問のコメントにも記載されています。これはもっと高いはずです。
abagh0703 2018年

5

2018年、MozillaはここMozilla Docsで私たちに警告します

「ロギングオブジェクト」を引用します。

使用せず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を再生成することでした。これにより、非表示の文字がなくなりました。


あなたはヒーローです!これを投稿してくれてありがとう。髪を抜いていた。
ジョーダン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

});


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

私は同様の問題を抱えているか、おそらく関連しています。

私の場合、オブジェクトのプロパティにアクセスしていましたが、1つは未定義でした。オブジェクトのkey、valを作成しているときに、サーバー側コードの空白が問題であることがわかりました。

私のアプローチは次のとおりでした...

オブジェクトを作成しています... "word"の空白に注意してください

REST APIから受け取る応答

値をログに記録するJavaScriptコード

コンソールからの結果のログ

オブジェクトを作成するサーバー側のコードから空白を削除した後、次のようにプロパティにアクセスできます...

空白を削除した後の結果

これは件名の問題の場合の問題ではないかもしれませんが、私の問題であり、他の誰かの問題であるかもしれません。それが役に立てば幸い。


1

Mongooseを使用してMongoDBからロードされたドキュメントで同じ問題が発生しました。

プロパティfind()を使用して1つのオブジェクトのみを返すことがわかったので、に変更 find()findOne()、すべてがうまくいきました。

解決策(Mongooseを使用している場合):必ず1つのオブジェクトのみを返すようにします。そうすれば、そのオブジェクトを解析できるようになります。そうしない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またはコンソール表現とは異なる値を持つオブジェクトを作成する方法であるため、この回答がなぜ反対票だったのかはわかりません。別の答えでそれを明らかにするまで、それが存在することを知りませんでした。この種の問題で検討するポイントなので、この答えは支持されるべきだと思います。
リック・ラブ

ちょうど0点の回答の数を考えると、誰かがすべてを反対投票しただけだと思います。
emote_control

0

今日も同じ問題に直面しました。私の場合、キーはネストされていました。つまり、key1.key2です。私はsplit()を使用してキーを分割し、角かっこ表記を使用しましたが、これでうまくいきました。

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

キーを分割して、data [key1] [key2]のように使用しました。


0

今日も同じ問題がありました。問題の原因はuglify-jsです。同じ非ugliedコードの問題を実行した後、解決されました。の削除

--mangle-props

uglify-jsからは、醜いコードを機能させるのに十分でした。

おそらく、ベストプラクティスは、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.