414

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

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

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

コンソール出力

4

33 に答える 33

371

の出力console.log(anObject)は誤解を招きます。表示されているオブジェクトの状態は、コンソールに表示されているオブジェクト ツリーを をクリックして展開したときにのみ解決されます>。オブジェクトを'd'したときのオブジェクトの状態ではありません。console.log

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

(通常)通話後にキーが追加されていることがわかりますconsole.log

于 2013-07-09T11:25:40.997 に答える
91

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

オブジェクト全体で実行console.log()すると、すべてのドキュメント フィールド (データベースに保存されているもの) が表示されます。ただし、個々のプロパティ アクセサーの中にはundefined、他のもの ( を含む_id) が正常に機能したときに を返すものもありました。

プロパティアクセサーは、私のmongoose.Schema(...)定義で指定されたフィールドに対してのみ機能するのに対し、データベースに保存されているすべてのフィールドconsole.log()を返すことが判明しました。JSON.stringify()

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

于 2016-04-09T20:35:03.990 に答える
31

オブジェクト内にオブジェクトの配列があるかどうかを確認します。JSONで同様の問題がありました:

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

「カテゴリ」から「名前」キーにアクセスしようとしましたが、次を使用していたため、未定義のエラーが発生しました。

var_name = obj_array.terms.category.name

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

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

そして、それはトリックを行います。

この答えには遅すぎるかもしれませんが、解決策を見つける前に私がしたように、同じ問題を抱えている人がこれを見つけてくれることを願っています:)

于 2015-08-11T21:27:52.410 に答える
27

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

var a = config.col_id_3;    //undefined

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

}, 100);
于 2016-03-27T18:18:14.403 に答える
15

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

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

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ました。そのとき、プロミスが完全に更新される前にオブジェクトが評価されていることに気づきました。

于 2016-09-21T02:18:37.067 に答える
2

同様の問題がありました。次の解決策が誰かに役立つことを願っています。
ここで何人かが提案しているように function を使用できます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-11-26T13:20:04.637 に答える
1

私もこの問題に遭遇しました。簡単に言えば、私の API は JSON ではなく文字列型を返していました。そのため、ログに出力したときはまったく同じように見えましたが、プロパティにアクセスしようとすると、未定義のエラーが発生しました。

API コード:

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

以前は戻ってきたばかりでした:

return Json(string Of object);
于 2019-12-19T04:23:19.797 に答える
1

私はこの質問について多くの答えを試しましたが、最終的に何が起こったのかを見つけました。

オブジェクトは使用時にのみ生成されるconsole.log(foo) getメソッドとsetnew Foo()メソッドで出力さ れますが、プレーンjsオブジェクトでインスタンスを初期化する必要があります

ご覧ください: https://stackoverflow.com/a/41153231/5954248

于 2021-11-09T11:15:37.310 に答える
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 ラッパーであり、最初のデバッグは私に嘘をついていたことに気付きました。

于 2016-05-06T11:08:25.577 に答える
0

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

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

しかし .toJSON() は:

toJSON() {
  return this.foo
}

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

于 2017-08-11T20:35:37.807 に答える
0

この回答の文脈では: https://stackoverflow.com/a/52994419

ファイルを再生成するソリューションは、常に実行できるとは限りません。文字列の前にある「非スペース」文字を取り除きます。trimしたがって、フィールド名を指定できれば、問題が解決されます。

このようなもの:

const records = parse(csvData, {
      columns: (colNameArray) => {
        return colNameArray.map((value, index) => {          
          return index === 0 ? value.trim() : value;
        });
      },
      onRecord: mapper.mapRow
    });

これのパフォーマンスを気にしない場合は、indexチェックをスキップすることもできます.

于 2021-05-06T13:26:13.927 に答える