JavaScript Object Iteration - PullRequest
       9

JavaScript Object Iteration

0 голосов
/ 27 апреля 2011

У меня проблемы с доступом к определенным свойствам объекта, который я получаю в виде JSON из серверного скрипта в результате выполняемого мной вызова AJAX.Мои данные JSON могут поступать в одной из двух форм, в зависимости от данных в самом объекте.

Форма 1:

        "MY_OBJ" : { "FILE" : "myfile.txt",
        "PARAMS" : { "PARAM" : { "KEY" : "mykey",
                "VALUE" : "myvalue"
              } }
          }

Форма 2:

        "MY_OBJ" : { "FILE" : "myfile.txt",
        "PARAMS" : { "PARAM" : [ { "KEY" : "mykeyone",
                  "VALUE" : "myvalueone"
                },
                { "KEY" : "mykeytwo",
                  "VALUE" : "myvaluetwo"
                }
              ] }
          }

Вот как я сейчас пытаюсь проанализировать данные для отображения в браузере:

    function(v) {
var myFormattedData = v.FILE;
if (v.PARAMS !== undefined && v.PARAMS.PARAM !== undefined &&  v.PARAMS.PARAM.KEY !== undefined && v.PARAMS.PARAM.VALUE !== undefined) {
    myFormattedData += '<br />' + v.PARAMS.PARAM.KEY + ' : ' + v.PARAMS.PARAM.VALUE;
} }

Этот метод отлично работает, когда мои данные находятся в форме 1. В этой ситуации я получу вывод в браузере, как...

myfile.txt
mykey : myvalue

... это именно то, что я хочу.

Однако, когда данные находятся в форме 2, все, что я получаю, это имя файла, отображаемое в браузере, как это...

myfile.txt

... но я пытаюсь получить что-то вроде ...

myfile.txt
mykeyone : myvalueone
mykeytwo : myvaluetwo

Мне нужно уметь обрабатывать получение данных в обеих формах.Что еще хуже, я, вероятно, также должен планировать возможность получения более чем одной или двух пар ключ-значение в какой-то момент в будущем.Я боролся с этим в течение длительного времени.Любая помощь очень ценится!

Спасибо!

Ответы [ 4 ]

4 голосов
/ 27 апреля 2011

Чтобы упростить обработку, проверьте тип объекта PARAM.Если это массив, то у вас есть ответ типа 2. В противном случае это ответ типа 1. Далее упростите преобразование типа 1 в тип 2, поместив PARAM в массив, так что вы можете рассматривать все как массив вна стороне клиента независимо от того, как сервер отправляет его.

function(data) {
    var params = data.PARAMS.PARAM;
    if (!(params instanceof Array)) {
        // convert to Array to treat everything alike
        params = [ params ];
    }
    // now that we know we are always dealing with an array,
    // loop through each item and print each key, value pair
    params.forEach(function(param) {
        console.log(param.KEY + ": " + param.VALUE);
    });
}
0 голосов
/ 27 апреля 2011

Попробуйте сделать что-то подобное для второй формы:

for(i=0;i<v.PARAMS.PARAM.length;i++) {
   myFormattedData += '<br />' + v.PARAMS.PARAM[i].KEY + ' : ' + v.PARAMS.PARAM[i].VALUE;
}
0 голосов
/ 27 апреля 2011

Во второй версии v.PARAMS.PARAM является массивом. Вы должны проверить, что это на самом деле массив, а затем повторить этот массив. Следующий код будет работать только для формы 2. Если возможно, что любая форма должна вернуться с сервера, вам нужно смешать свою функцию с тем, что я показываю.

function( v )
{
    var myFormattedData = v.FILE;
    if( v.PARAMS !== undefined && v.PARAMS.PARAM !== undefined && v.PARAMS.PARAM instanceof Array )
    {
        var l = v.PARAMS.PARAM.length,
            current;
        for( var i = 0; i < l; i++ )
        {
            current = v.PARAMS.PARAM[i];
            if( current.KEY !== undefined && current.VALUE !== undefined )
            {
                myFormattedData += '<br />' + current.KEY + ' : ' + current.VALUE;
            }
        }
    }
}
0 голосов
/ 27 апреля 2011

В форме 1 v.PARAMS.PARAM.KEY будет не нулевым.

В форме 2 он будет нулевым.
В этом случае вам нужно ссылаться на ваши ключи и значения как v.PARAMS.PARAM[0].KEY и v.PARAMS.PARAM[0].VALUE, а также v.PARAMS.PARAM[1].KEY

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