J'ai des problèmes avec .stringify()
, mais je pense que mon tableau JavaScript doit se tromper, voici mon code:
var questions = new Array(); $('#Valid').hover(function(){ for (i=0;i < $('.Questions').length;i++){ questions[i]=new Array(); questions[i]['numero']=$('.Numero:eq('+i+')').html(); questions[i]['question']=$('.ItemInput:eq('+i+')').val(); questions[i]['variable']=$('.VarName:eq('+i+')').val(); } var stringJSON=JSON.stringify(questions) alert (stringJSON) })
Le stringJSON var retourne:
[[]]
Qu'est-ce que je fais mal?
Les tableaux ont des clés entières, pas des chaînes.
Utilisez plutôt un objet; Les objets dans JS ressemblent à des tableaux associatifs:
var questions = new Array(); $('#Valid').hover(function(){ for (var i=0;i < $('.Questions').length;i++){ questions[i]={}; questions[i]['numero']=$('.Numero:eq('+i+')').html(); questions[i]['question']=$('.ItemInput:eq('+i+')').val(); questions[i]['variable']=$('.VarName:eq('+i+')').val(); } var stringJSON=JSON.stringify(questions); alert(stringJSON); });
Définir des questions[i]
à {}
est la clé.
Vous pouvez raccourcir cette syntaxe:
var questions = new Array(); $('#Valid').hover(function(){ for (var i=0;i < $('.Questions').length;i++){ questions[i] = { numero: $('.Numero:eq('+i+')').html(), question: $('.ItemInput:eq('+i+')').val(), variable: $('.VarName:eq('+i+')').val() }; } var stringJSON=JSON.stringify(questions); alert(stringJSON); });
Remplacer les questions[i]=new Array();
Avec des questions[i] = {};
(Ou = new Object();
si vous voulez vraiment cette syntaxe "moche").
Les tableaux en JavaScript sont comme des tableaux dans des langages comme C: ils ne prennent en charge que des index entiers dans l'intervalle [0, array.length)
.
Pour les tableaux associatifs, vous utilisez des objets créés à l'aide de l'objet literal {}
.
Tout d'abord, votre variable "questions" semble être conçue comme un véritable tableau. Ce que vous mettez dans le tableau, cependant, ne sont pas des tableaux réels – ce ne sont que des objets avec des propriétés.
var questions = []; $('#Valid').hover(function(){ for (var i=0;i < $('.Questions').length;i++){ questions[i] = { 'numero': $('.Numero:eq('+i+')').html(), 'question': $('.ItemInput:eq('+i+')').val(), 'variable': $('.VarName:eq('+i+')').val() }; } var stringJSON=JSON.stringify(questions) alert (stringJSON) });
(Notez que j'ai également ajouté un var
pour la variable de boucle "i" – important!)
Maintenant, pour savoir pourquoi la chose arrive vide, eh bien, je soupçonne que c'est parce que $('.Questions')
est vide.
Ah et aussi, c'est quelque chose que vous pouvez utiliser l'API jQuery ".map ()" pour:
$('#Valid').hover(function() { questions = $('.Questions').map(function(i, q) { return { 'numero': $('.Numero:eq('+i+')').html(), 'question': $('.ItemInput:eq('+i+')').val(), 'variable': $('.VarName:eq('+i+')').val() }; }).get(); var stringJSON = JSON.stringify(questions); alert(stringJSON); });
C'est un peu plus agréable car il contourne le problème laid de réévaluer $('.Questions')
sur chaque itération de la boucle.