Issues Stringifying a multidimensional array with json.js

前端 未结 3 1061
轮回少年
轮回少年 2021-02-08 04:07

I have problems with .stringify(), but I think my JavaScript array must be wrong, here\'s my code:

var questions = new Array();

$(\'#Valid\').hover         


        
相关标签:
3条回答
  • 2021-02-08 04:50

    Arrays have integer keys, not strings.

    Use an object instead; objects in JS sort of look like associative arrays:

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

    Setting questions[i] to {} is the key.

    You can shorten this syntax:

    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);
    });
    
    0 讨论(0)
  • 2021-02-08 05:01

    Fix:

    Replace questions[i]=new Array(); with questions[i] = {}; (or = new Object(); if you really want this "ugly" syntax).

    Explanation:

    Arrays in JavaScript are like arrays in languages like C: They only support integer indexes in the interval [0, array.length).

    For associative arrays, you use objects which are created using the object literal {}.

    0 讨论(0)
  • 2021-02-08 05:04

    First, your "questions" variable appears to be intended as a real array. What you're putting inside the array, however, are not real arrays — they're just objects with properties.

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

    (Note that I also added a var for the "i" loop variable - important!)

    Now, as to why the thing is coming up empty, well, I suspect it's because $('.Questions') is coming up empty.

    Oh and also, this is something you could use the jQuery ".map()" API for:

     $('#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);
    });
    

    That's a little nicer because it gets around the ugly problem of re-evaluating $('.Questions') on every iteration of the loop.

    0 讨论(0)
提交回复
热议问题