オブジェクトプロパティが存在していてもアクセスできません。未定義を返します
これは私を困惑させています。これを説明する方法が他にはわかりませんが、これが私のデバッグコードの外観です。その下には、これら2つのログからの出力があります。最初のものはアクセスしようとしているプロパティを持つ完全なJavaScriptオブジェクトを明確に示していますが、次の行コードはconfig.col_id_3ではアクセスできません(スクリーンショットの "undefined"を参照)誰もがこれを説明できますか? field_id_4以外の他のすべてのプロパティにもアクセスできます。
console.log(config);
console.log(config.col_id_3);
これがconsole.log()がコンソールに出力するものです。
console.log(anObject)
の出力は誤解を招くものです。表示されるオブジェクトの状態は、コンソールで>
を展開したときにのみ解決されます。これはnotオブジェクトをconsole.log
'dしたときのオブジェクトの状態です。
代わりに、console.log(Object.keys(config))
、またはconsole.log(JSON.stringify(config))
を試してみてください。console.log
を呼び出したときのキーまたはオブジェクトの状態が表示されます。
(通常)キーが追加されているafterconsole.log
呼び出しが見つかります。
私は、 Mongoose を使ってMongoDBからロードされたドキュメントでこの問題を抱えています。
オブジェクト全体に対してconsole.log()
を実行すると、(dbに格納されている)すべての文書フィールドが表示されます。しかし、他のもの(_id
を含む)が正常に機能した場合、一部の個々のプロパティアクセサはundefined
を返します。
mongoose.Schema(...)
とconsole.log()
はdbに格納されているすべてのフィールドを返すのに対し、プロパティアクセサは私のJSON.stringify()
定義で指定されたフィールドに対してのみ機能することがわかった。
解決策(Mongooseを使用している場合):すべてのdbフィールドがmongoose.Schema(...)
で定義されていることを確認してください。
オブジェクトの中にオブジェクトの配列があるかどうかを確認してください。私は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
そしてそれがトリックです。
この回答には遅すぎるかもしれませんが、同じ問題を抱えている人が解決策を見つける前に行ったのと同じように見つけられることを願います。
アクセスしようとしているプロパティはまだ存在しない可能性があります。 Console.logは少し遅れて実行されるので機能しますが、それ以外のコードではそうではありません。これを試して:
var a = config.col_id_3; //undefined
setTimeout(function()
{
var a = config.col_id_3; //voila!
}, 100);
私は同じ問題を抱えていました。私にとっての解決策は、JSONを解析するための入力として文字列化された出力を使用することでした。これは私のために働いた。あなたに役立つことを願っています
var x =JSON.parse(JSON.stringify(obj));
console.log(x.property_actually_now_defined);
私の場合は、オブジェクトを約束に渡していました。約束の範囲内で、オブジェクトにさらにキーや値を追加し、それが完了すると、約束はオブジェクトを返しました。
しかし、私の側を少し見てみると、完全に完成する前にそのオブジェクトを返すことが約束されていました。したがって、残りのコードでは更新されたオブジェクトを処理しようとしました。しかし、上記のように、コンソールで、私はオブジェクトが完全に更新されているのを見ましたが、キーにアクセスすることができませんでした - それらは未定義に戻ってきていました。私がこれを見るまで:
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
と表示されます。約束が完全にそれを更新する前に私のオブジェクトが評価されていたことが私に起こった時にそれはそうします。
私は今日この問題に苦しんでいて、私は自分の解決策で返事をするつもりだと思った。
私はajax経由でデータオブジェクトを取得していました。これは次のようなものです。{"constants": {"value1":"x","value2":"y"},"i18n" {"data1":"x", "data2":"y"}}
このオブジェクトがdataという変数に入っているとしましょう。 data.i18n
を参照するときはいつでもundefined
を得ました。
console.log(data)
は期待どおりにオブジェクトを表示しましたconsole.log(Object.keys(data))
は予想通り["constants","i18n"]
と言いました- 国際化をinterに変更しても何も変わりませんでした。
- 私は "i18n"を最初のオブジェクトにするためにデータを切り替えようとさえしました
- オブジェクトが完全に設定され、ajaxの約束に問題がないことを確実にするためにコードを移動しました。
何も助けにはなりませんでした...それからサーバー側で私はphpログにデータを書きました、そしてそれはこれを明らかにしました:
{"constants": {"value1":"x","value2":"y"},"\u045618n" {"data1":"x", "data2":"y"}}
インデックスキーの "i"は、実際はu0456(キリル文字i)です。これは私のphpエディタやブラウザのコンソールログには見えませんでした。 phpログだけがこれを明らかにしました...それはトリッキーなものでした...
私のデータは単にJSONデータ文字列でした。 (この変数はセッションでjson文字列として格納されていました)。
console.log(json_string_object)
- >この文字列の表現だけを返すので、文字列かオブジェクトかを区別することはできません。
それでそれを機能させるために私はそれを実際のオブジェクトに変換する必要がありました:
object = JSON.parse(json_string_object);
コメントするのに十分な投稿がないという苛立ちのため、ここにはあまり投稿しませんが、これを投稿した人は正しかったです。オブジェクトにアクセスしようとしたときに、ajax呼び出しが完了していませんでした。私はさらに進んでタイムアウトのために100の代わりに500を使うでしょう。
var a = config.col_id_3; //undefined
setTimeout(function()
{
var a = config.col_id_3; //voila!
}, 500);
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...
TypeScript
やANGULAR
、あるいはその両方を使用しているのであれば、これになります。
.then((res: any) => res.json())
レスポンスタイプをanyに設定すると、この問題は解決しました。resを設定するまでレスポンスのプロパティにアクセスできませんでした。res:any
この質問を参照してください プロパティ '_body'はタイプ '応答'に存在しません
私は同様の問題を抱えていた、次の解決策が誰かに役立つことを願っています。
ここで提案しているように、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
});
2018年、Mozillaは Mozilla Docsで私たちに警告します 。
「オブジェクトのロギング」を引用します。
console.log(obj);
を使わない、console.log(JSON.parse(JSON.stringify(obj)));
を使う。このようにして、あなたはそれをログに記録した瞬間にobjの値を見ていると確信しています。
私の場合は、受信したオブジェクトが文字列型になるまで、myMethod(data:MyModelClass)
オブジェクトのようなモデルの形式でデータを受信したとしても、それは偶然です。これはconsole.log(data)のyです私は内容を取得します。解決策はJSONを解析することです(私の場合)
const model:MyMOdelClass=JSON.parse(data);
考えが役に立つかもしれません。
私にとっては、マングース関連の問題であることがわかりました。
Mongoのクエリから取得したオブジェクトをループしていました。私はただ削除しなければなりませんでした:
await items = Model.find()
そしてそれを次のように置き換えます。
await items = Model.find().lean()
私はちょうどMS Excelによって生成されたCSVファイルからcsv-parserによって生成されたオブジェクトでこの問題に遭遇しました。最初のプロパティを除くすべてのプロパティにアクセスできました - ただし、console.logを使用してオブジェクト全体を書き込んだ場合は問題ありません。
UTF-8 CSV形式では、目に見えない文字に対応する3バイト(ef bb bf)が先頭に挿入され、csv-parserによって最初のプロパティヘッダーの一部として含まれていました。解決策は、非UTFオプションを使用してCSVを再生成することでした。これにより、見えない文字が削除されました。
config = JSON.parse(config);
私は同じことをしていました、私が期待していたようにデータはテキストであってJSONではありませんでした。
私はMongooseを使ってMongoDBからロードされたドキュメントに関して同じ問題を抱えています。
1つのオブジェクトだけを返すためにfind()
プロパティを使用しているので、find()
をfindOne()
に変更しました。
解決策(Mongooseを使用している場合):必ず1つのオブジェクトだけを返すようにしてください。そうすれば、そのobject.id
を解析できます。そうしないと、object[0].id
のようにアクセスする必要があります。
Config [0]またはconfig [0] .col_id_3で試してください
私もこの問題を抱えていました。ログに記録するためにオブジェクトを見ることができましたが、コードからアクセスすることはできませんでした。それから私はそれの前に[0]を加えようとし、そして私の問題を解決しました。それから私はすべてのプロパティにアクセスできました。
私は同じ問題を抱えていて、上記の解決策は私にはうまくいきませんでした。しかし、オブジェクトを作成するコードを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
});
私はこのような問題がありました、そして、解決策が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ラッパーであり、最初のデバッグは私にうそをついていることに気づかせてくれました。
素晴らしい提案私はちょうど同じような問題を抱えていたので、2セントです。この問題を解決した1つのことは、私の要求オプションに 'json:true'を追加したことです。 (もちろん、使用するライブラリによって異なりますが、一般的な前提は同じです - 受け取る予定のコンテンツ形式を指定してください。)
今日も同じ問題がありました。問題は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)
今日も同じ問題に直面しました。私の場合、キーは入れ子になっていました、すなわちkey1.key2。 split()を使用してキーを分割してから、角括弧表記を使用しました。これは有効でした。
var data = {
key1: {
key2: "some value"
}
}
私はキーを分割してこのように使用しました、私のために仕事をしたdata [key1] [key2]。
ここに素晴らしい提案があります。誰かがそれが役に立つと思うかもしれないので私は付け加えます。
ブラウザ内またはリモートでのキャッシュには十分注意してください。
私がオンラインで開発しているとき、私はこれに苦労していて、そして簡単な戦略を実行しました。
- 私は私のjsスクリプトのブラウザの負荷にアンチキャッシングを置きました。 "quote:"キャッシュを防ぐため、すべての.cssファイルと.jsファイルにクエリ文字列 "?v = 1"を追加します。 "
- 新しいリクエストを試す前に、私が修正した追加のコンソールログを書きます。console.log( "");コンソールにこの新しいログが表示されない場合は、どこかにキャッシュの問題があります。
構文が正しくなったら、先に提案した遅延を削除しましたが、すべて問題ありません。私にとっては、「JSON.stringify(」を使用しなければなりませんでした)
万が一これが誰かに役立つ場合、私は同様の問題を抱えていました、そしてそれは誰かが私が働いていたオブジェクトで.toJSONのためにオーバーライドを作成したからです。そのため、オブジェクトは次のようになりました。
{
foo: {
bar: "Hello"
baz: "World"
}
}
しかし、.toJSON()は次のとおりです。
toJSON() {
return this.foo
}
そのため、JSON.stringify(myObject)を呼び出すと、 "{" bar ":" Hello "、" baz ":" World "}"が返されました。しかし、Object.keys(myObject)は "foo"を明らかにしました。
(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);
}
});