JavaScript对象迭代

JavaScript对象迭代,javascript,json,Javascript,Json,我在访问从服务器端脚本接收的JSON对象中的某些属性时遇到问题,这是我正在进行的AJAX调用的结果。我的JSON数据可以有两种形式,具体取决于对象本身中的数据 表格1: "MY_OBJ" : { "FILE" : "myfile.txt", "PARAMS" : { "PARAM" : { "KEY" : "mykey", "VALUE" : "myvalue" } } } 表格2:

我在访问从服务器端脚本接收的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;
} }
…这正是我想要的

然而,当数据在表单2中时,我得到的只是浏览器中显示的文件名,如下所示

myfile.txt
。。。但我想得到的是

myfile.txt
mykeyone : myvalueone
mykeytwo : myvaluetwo
我需要能够处理两种形式的数据。更糟糕的是,我可能还应该计划在将来的某个时候接收不止一个或两个键值对的可能性。我已经为此奋斗了很长时间。非常感谢您的帮助


谢谢大家!

在表单1中,
v.PARAMS.PARAM.KEY
将不为空

在表格2中,它将为空。

在这种情况下,您需要将键和值引用为
v.PARAMS.PARAM[0]。键
v.PARAMS.PARAM[0]。值
v.PARAMS.PARAM[1]。键

在表单1中,
v.PARAMS.PARAM.KEY
将不为空

在表格2中,它将为空。

在这种情况下,您需要将键和值引用为
v.PARAMS.PARAM[0]。键
v.PARAMS.PARAM[0]。值
v.PARAMS.PARAM[1]。在第二个版本中,
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;
            }
        }
    }
}
功能(v)
{
var myFormattedData=v.FILE;
if(v.PARAMS!==未定义和&v.PARAMS.PARAM!==未定义和&v.PARAMS.PARAM数组实例)
{
var l=v.PARAMS.PARAM.length,
现在的
对于(变量i=0;i
在第二个版本中,
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;
            }
        }
    }
}
功能(v)
{
var myFormattedData=v.FILE;
if(v.PARAMS!==未定义和&v.PARAMS.PARAM!==未定义和&v.PARAMS.PARAM数组实例)
{
var l=v.PARAMS.PARAM.length,
现在的
对于(变量i=0;i
要简化处理,请检查
PARAM
对象的类型。如果它是一个数组,那么您有一个类型为2的响应。否则,这是类型1的响应。通过将
PARAM
包装到数组中,将类型1转换为类型2,从而进一步简化,这样无论服务器如何发送,您都可以在客户端将所有内容视为一个数组

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

要简化处理,请检查
PARAM
对象的类型。如果它是一个数组,那么您有一个类型为2的响应。否则,这是类型1的响应。通过将
PARAM
包装到数组中,将类型1转换为类型2,从而进一步简化,这样无论服务器如何发送,您都可以在客户端将所有内容视为一个数组

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

尝试对第二个表单执行以下操作:

for(i=0;i<v.PARAMS.PARAM.length;i++) {
   myFormattedData += '<br />' + v.PARAMS.PARAM[i].KEY + ' : ' + v.PARAMS.PARAM[i].VALUE;
}

for(i=0;i尝试对第二个表单执行以下操作:

for(i=0;i<v.PARAMS.PARAM.length;i++) {
   myFormattedData += '<br />' + v.PARAMS.PARAM[i].KEY + ' : ' + v.PARAMS.PARAM[i].VALUE;
}

for(i=0;i+1我的想法:)替代(更复杂)数组检测:
Object.prototype.toString.call(params)=“[Object array]”
谢谢Felix。我在好几个地方见过这种类型的类型检测。这是因为与IE兼容吗?我问自己同样的问题,因为我不知道为什么经常使用它而不是数组的
实例。我在谷歌上搜索了一下,但只发现了这样一个问题:对不起,我现在不能多说了。+1我的想法:)替代(更复杂的)数组检测:
Object.prototype.toString.call(params)==“[Object array]”
谢谢Felix。我在几个地方见过这种类型的类型检测。这是因为与IE兼容吗?我问自己同样的问题,因为我不知道为什么经常使用它而不是数组的实例。我在谷歌上搜索了一下,但只发现了这样一点:对不起,我现在不能多说了。我收到了关于这个问题的很好的答案!我试过几种不同的方法。根据@Felix Kling的评论,我决定使用的、目前看来对我最有效的方法,以及让我为将来更多的键值对做好准备的方法是检查
Object.prototype.toString.call(v.PARAMS.PARAM)===“[Object Array]”
。当它返回true时,我运行(Anthony Accioly)循环。当它返回false时,我只运行我的
myFormattedData+='
'+v.PARAMS.PARAM.KEY+':'+v.PARAMS.PARAM.VALUE。谢谢我在这方面得到了很好的回答!我试过几种不同的方法。根据@Felix Kling的评论,我决定使用的、目前看来对我最有效的方法,以及让我为将来更多的键值对做好准备的方法是检查
Object.prototype.toString.call(v.PARAMS.PARAM)===“[Object Array]”
。当它返回true时,我运行(Anthony Accioly)循环。当它返回false时,我只运行我的
myF