JavaScript对象迭代

JavaScript Object Iteration

本文关键字:迭代 对象 JavaScript      更新时间:2023-09-26

由于我正在进行AJAX调用,我在访问从服务器端脚本接收到的JSON对象中的某些属性时遇到了问题。我的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

我需要能够处理以两种形式获取数据。更糟糕的是,我可能还应该计划在将来某个时候接收不止一个或两个键值对的可能性。我已经为此挣扎了很长时间。任何帮助都非常感激!

谢谢!

为简化处理,请检查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;
}

在form1中,v.PARAMS.PARAM.KEY将是非空的

在表格2中,它将为空。
在本例中,您需要将键和值引用为v.PARAMS.PARAM[0].KEYv.PARAMS.PARAM[0].VALUE,以及v.PARAMS.PARAM[1].KEY

在第二个版本中,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;
            }
        }
    }
}