web-dev-qa-db-ja.com

オブジェクトプロパティが存在していてもアクセスできません。未定義を返します

これは私を困惑させています。これを説明する方法が他にはわかりませんが、これが私のデバッグコードの外観です。その下には、これら2つのログからの出力があります。最初のものはアクセスしようとしているプロパティを持つ完全なJavaScriptオブジェクトを明確に示していますが、次の行コードはconfig.col_id_3ではアクセスできません(スクリーンショットの "undefined"を参照)誰もがこれを説明できますか? field_id_4以外の他のすべてのプロパティにもアクセスできます。

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

これがconsole.log()がコンソールに出力するものです。

Console output

276
Brian Litzinger

console.log(anObject)の出力は誤解を招くものです。表示されるオブジェクトの状態は、コンソールで>を展開したときにのみ解決されます。これはnotオブジェクトをconsole.log 'dしたときのオブジェクトの状態です。

代わりに、console.log(Object.keys(config))、またはconsole.log(JSON.stringify(config))を試してみてください。console.logを呼び出したときのキーまたはオブジェクトの状態が表示されます。

(通常)キーが追加されているafterconsole.log呼び出しが見つかります。

260
Matt

私は、 Mongoose を使ってMongoDBからロードされたドキュメントでこの問題を抱えています。

オブジェクト全体に対してconsole.log()を実行すると、(dbに格納されている)すべての文書フィールドが表示されます。しかし、他のもの(_idを含む)が正常に機能した場合、一部の個々のプロパティアクセサはundefinedを返します。

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

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

39
ramin

オブジェクトの中にオブジェクトの配列があるかどうかを確認してください。私は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
Asaf Lopez

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

var a = config.col_id_3;    //undefined

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

}, 100);
19
Lai Xue

私は同じ問題を抱えていました。私にとっての解決策は、JSONを解析するための入力として文字列化された出力を使用することでした。これは私のために働いた。あなたに役立つことを願っています

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

私の場合は、オブジェクトを約束に渡していました。約束の範囲内で、オブジェクトにさらにキーや値を追加し、それが完了すると、約束はオブジェクトを返しました。

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

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と表示されます。約束が完全にそれを更新する前に私のオブジェクトが評価されていたことが私に起こった時にそれはそうします。

9
rolinger

私は今日この問題に苦しんでいて、私は自分の解決策で返事をするつもりだと思った。

私はajax経由でデータオブジェクトを取得していました。これは次のようなものです。{"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. 国際化interに変更しても何も変わりませんでした。
  4. 私は "i18n"を最初のオブジェクトにするためにデータを切り替えようとさえしました
  5. オブジェクトが完全に設定され、ajaxの約束に問題がないことを確実にするためにコードを移動しました。

何も助けにはなりませんでした...それからサーバー側で私はphpログにデータを書きました、そしてそれはこれを明らかにしました:

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

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

8
Jette

私のデータは単にJSONデータ文字列でした。 (この変数はセッションでjson文字列として格納されていました)。

console.log(json_string_object)

- >この文字列の表現だけを返すので、文字列かオブジェクトかを区別することはできません。

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

object = JSON.parse(json_string_object);
6
makkasi

コメントするのに十分な投稿がないという苛立ちのため、ここにはあまり投稿しませんが、これを投稿した人は正しかったです。オブジェクトにアクセスしようとしたときに、ajax呼び出しが完了していませんでした。私はさらに進んでタイムアウトのために100の代わりに500を使うでしょう。

var a = config.col_id_3;    //undefined

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

}, 500);
4
almcaffee

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

TypeScriptANGULAR、あるいはその両方を使用しているのであれば、これになります。

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

レスポンスタイプをanyに設定すると、この問題は解決しました。resを設定するまでレスポンスのプロパティにアクセスできませんでした。res:any

この質問を参照してください プロパティ '_body'はタイプ '応答'に存在しません

2
russiansummer

私は同様の問題を抱えていた、次の解決策が誰かに役立つことを願っています。
ここで提案しているように、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
Lefan

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

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

console.log(obj);を使わない、console.log(JSON.parse(JSON.stringify(obj)));を使う。

このようにして、あなたはそれをログに記録した瞬間にobjの値を見ていると確信しています。

2
MTZ

私の場合は、受信したオブジェクトが文字列型になるまで、myMethod(data:MyModelClass)オブジェクトのようなモデルの形式でデータを受信したとしても、それは偶然です。これはconsole.log(data)のyです私は内容を取得します。解決策はJSONを解析することです(私の場合)

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

考えが役に立つかもしれません。

2
Karthikeyan M

私にとっては、マングース関連の問題であることがわかりました。

Mongoのクエリから取得したオブジェクトをループしていました。私はただ削除しなければなりませんでした:

await items = Model.find()

そしてそれを次のように置き換えます。

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

私はちょうどMS Excelによって生成されたCSVファイルからcsv-parserによって生成されたオブジェクトでこの問題に遭遇しました。最初のプロパティを除くすべてのプロパティにアクセスできました - ただし、console.logを使用してオブジェクト全体を書き込んだ場合は問題ありません。

UTF-8 CSV形式では、目に見えない文字に対応する3バイト(ef bb bf)が先頭に挿入され、csv-parserによって最初のプロパティヘッダーの一部として含まれていました。解決策は、非UTFオプションを使用してCSVを再生成することでした。これにより、見えない文字が削除されました。

1
Mike Rizzo
config = JSON.parse(config);

私は同じことをしていました、私が期待していたようにデータはテキストであってJSONではありませんでした。

1
obotezat

私はMongooseを使ってMongoDBからロードされたドキュメントに関して同じ問題を抱えています。

1つのオブジェクトだけを返すためにfind()プロパティを使用しているので、find()findOne()に変更しました。

解決策(Mongooseを使用している場合):必ず1つのオブジェクトだけを返すようにしてください。そうすれば、そのobject.idを解析できます。そうしないと、object[0].idのようにアクセスする必要があります。

Config [0]またはconfig [0] .col_id_3で試してください

私もこの問題を抱えていました。ログに記録するためにオブジェクトを見ることができましたが、コードからアクセスすることはできませんでした。それから私はそれの前に[0]を加えようとし、そして私の問題を解決しました。それから私はすべてのプロパティにアクセスできました。

1
Leonardo Atalla

私は同じ問題を抱えていて、上記の解決策は私にはうまくいきませんでした。しかし、オブジェクトを作成するコードを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
Tushar Shukla

私は似たような問題を抱えていたか、あるいは関連しているだけかもしれません。

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

私のアプローチは以下の通りです...

creating my object... notice the white-space in "Word"

response I get from my REST API

javascript code to log the values

log results from console

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

result after removing whitespace

これは主題の質問の場合の問題ではないかもしれませんが私の場合のためであり、他の人のためにそうかもしれません。それが役に立てば幸い。

1
rey_coder

私はこのような問題がありました、そして、解決策が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
Marcus Downing

素晴らしい提案私はちょうど同じような問題を抱えていたので、2セントです。この問題を解決した1つのことは、私の要求オプションに 'json:true'を追加したことです。 (もちろん、使用するライブラリによって異なりますが、一般的な前提は同じです - 受け取る予定のコンテンツ形式を指定してください。)

0
itsKarma

今日も同じ問題がありました。問題はuglify-jsによって引き起こされました。私は同じ非醜いコードの問題を実行した後に解決されました。の削除

--mangle-props

from 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
Ilja Kartašov

今日も同じ問題に直面しました。私の場合、キーは入れ子になっていました、すなわちkey1.key2。 split()を使用してキーを分割してから、角括弧表記を使用しました。これは有効でした。

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

私はキーを分割してこのように使用しました、私のために仕事をしたdata [key1] [key2]。

0
C.O.G

ここに素晴らしい提案があります。誰かがそれが役に立つと思うかもしれないので私は付け加えます。

ブラウザ内またはリモートでのキャッシュには十分注意してください。

私がオンラインで開発しているとき、私はこれに苦労していて、そして簡単な戦略を実行しました。

  1. 私は私のjsスクリプトのブラウザの負荷にアンチキャッシングを置きました。 "quote:"キャッシュを防ぐため、すべての.cssファイルと.jsファイルにクエリ文字列 "?v = 1"を追加します。 "
  2. 新しいリクエストを試す前に、私が修正した追加のコンソールログを書きます。console.log( "");コンソールにこの新しいログが表示されない場合は、どこかにキャッシュの問題があります。

構文が正しくなったら、先に提案した遅延を削除しましたが、すべて問題ありません。私にとっては、「JSON.stringify(」を使用しなければなりませんでした)

0
Frieda

万が一これが誰かに役立つ場合、私は同様の問題を抱えていました、そしてそれは誰かが私が働いていたオブジェクトで.toJSONのためにオーバーライドを作成したからです。そのため、オブジェクトは次のようになりました。

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

しかし、.toJSON()は次のとおりです。

toJSON() {
  return this.foo
}

そのため、JSON.stringify(myObject)を呼び出すと、 "{" bar ":" Hello "、" baz ":" World "}"が返されました。しかし、Object.keys(myObject)は "foo"を明らかにしました。

0
emote_control

(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
Mariyo