Problèmes Affectation d'un tableau multidimensionnel avec json.js

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

Réparer:

Remplacer les questions[i]=new Array(); Avec des questions[i] = {}; (Ou = new Object(); si vous voulez vraiment cette syntaxe "moche").

Explication:

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.