web-dev-qa-db-fra.com

TypeError: data.forEach n'est pas une fonction

Voici mon code:

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

J'obtiens l'erreur qui pour chacun ne fonctionne pas sur la variable data. Cependant, lorsque je connecte data à la console, j'obtiens

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

Il s'agit clairement d'un tableau et itérable, donc je ne comprends pas exactement ce qui ne va pas.

EDIT: data est retourné via JsonResponse dans Django.

5

Je crois que data est une chaîne JSON. Puisque forEach() est une fonction de tableau et que vous essayez de l'implémenter sur la chaîne JSON, elle renvoie l'erreur:

"TypeError non intercepté: data.forEach n'est pas une fonction"

Vous devez analyser les données avec JSON.parse() avant d'utiliser forEach():

La méthode JSON.parse() analyse une chaîne JSON, construisant la valeur ou l'objet JavaScript décrit par la chaîne. Une fonction reviver facultative peut être fournie pour effectuer une transformation sur l'objet résultant avant qu'il ne soit renvoyé.

data = JSON.parse(data);

Démo:

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);
});

Donc le succès devrait être:

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

il suffit de vérifier s'il s'agit d'une chaîne ou d'un tableau JSOn

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

Vérifiez simplement si les données sont des chaînes JSON.

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

si oui, vous devez faire JSON.parse (data) et faire forEach dessus.

0
Anjana G

C'est un cas où votre réponse data ressemble à un tableau mais c'est une chaîne. Si vous avez accès à l'API à laquelle vous vous connectez, vous pouvez vous assurer que la réponse qu'elle envoie est un tableau mais si ce n'est pas simplement analyser la réponse data en utilisant JSON.parse() devrait faire l'affaire.

0
John Kennedy

Modifiez votre fonction de réussite en ceci, la fonction JSON.parse() est nécessaire pour parcourir la chaîne JSON:

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