web-dev-qa-db-ja.com

TypeError:data.forEachは関数ではありません

これは私のコードです:

$.ajax({
    url: "some_url/",
    type: "GET",
    dataType: "json",
    success: function(data){
        console.log(data);
        data.forEach(function(element){
            console.log(element);
        });
    }
});

それぞれに対してdata変数が機能しないというエラーが表示されます。しかし、コンソールにdataを記録すると、

[{"model": "app.mdl", "pk": 1, "fields": {"name": "test", "rank": 1}}]

これは明らかに配列であり反復可能であるため、正確には何が間違っているのかわかりません。

編集:dataはDjangoのJsonResponseを介して返されます。

dataはJSON文字列だと思います。 forEach()は配列関数であり、JSON文字列に実装しようとしているため、エラーがスローされます。

「キャッチされていないTypeError:data.forEachは関数ではありません」

JSON.parse()を使用する前に、 forEach() でデータを解析する必要があります。

JSON.parse()メソッドはJSON文字列を解析し、文字列で記述されたJavaScript値またはオブジェクトを構築します。オプションのリバイバー関数を提供して、結果のオブジェクトが返される前に変換を実行できます。

data = JSON.parse(data);

デモ:

var data = JSON.stringify([{"model": "app.mdl", "pk": 1, "fields": {"name": "test", "rank": 1}}]);
data = JSON.parse(data);
data.forEach(function(element){
    console.log(element);
});

したがって、successは次のようになります。

success: function(data){
    data = JSON.parse(data);
    console.log(data);
    data.forEach(function(element){
        console.log(element);
    });
}
9
Mamun

文字列かJSOn配列かを確認してください

if(typeof(data) === "string"){data = JSON.parse(data)}
 data.forEach(function(element){
            console.log(element);
        });
1
Negi Rox

データがJSON文字列かどうかを確認してください。

data = "[{"model":"app.mdl","pk":1,"fields":{"name":"test","rank":1}}]"

はいの場合、JSON.parse(data)を実行し、forEachを実行する必要があります。

0
Anjana G

これは、data応答が配列のように見えても文字列である場合です。接続しているAPIにアクセスできる場合は、接続が送信する応答が配列であることを確認できますが、そうでない場合は、JSON.parse()を使用してdata応答を解析するだけでうまくいきます。

0
John Kennedy

成功関数を次のように変更します。JSON文字列を反復処理するには、JSON.parse()関数が必要です。

success: function(data){
        data = JSON.parse(data);
        console.log(data);
        data.forEach(function(element){
            console.log(element);
        });
0
Meh