Проблемы строкового многомерного массива с помощью json.js - PullRequest
11 голосов
/ 02 марта 2011

У меня проблемы с .stringify(), но я думаю, что мой массив JavaScript должен быть неправильным, вот мой код:

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

СтрокаJSON var возвращает:

[[]]

Что я делаю не так?

Ответы [ 3 ]

19 голосов
/ 02 марта 2011

Массивы имеют целочисленные ключи, а не строки.

Вместо этого используйте объект;объекты в JS выглядят как ассоциативные массивы:

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

Значение ключа questions[i] - {}.

Вы можете сократить этот синтаксис:

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);
});
6 голосов
/ 02 марта 2011

Исправлено:

Замените questions[i]=new Array(); на questions[i] = {}; (или = new Object();, если вы действительно хотите этот "уродливый" синтаксис).

Объяснение:

Массивыв JavaScript они похожи на массивы в таких языках, как C: они поддерживают только целочисленные индексы в интервале [0, array.length).

. Для ассоциативных массивов вы используете объекты, созданные с использованием литерала объекта {}.

1 голос
/ 02 марта 2011

Во-первых, ваша переменная "questions" представляется как массив real .Однако вы помещаете внутри массива: , а не реальные массивы - это просто объекты со свойствами.

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

(Обратите внимание, что я такжедобавили var для переменной цикла "i" - важно!)

Теперь, что касается того, почему вещь пуста, я подозреваю, что это потому, что $('.Questions') пусто.

Да, кроме того, это то, что вы могли бы использовать для jQuery API ".map ()":

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

Это немного приятнее, потому что обходит уродливую проблему переоценки $('.Questions') на каждой итерации цикла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...