Jquery ajax返回已排序的数据

时间:2011-07-01 18:38:31

标签: javascript jquery

我有一个PHP脚本从数据库中提取数据,结果集按特定顺序返回,例如

Name: John, Age: 21, Address: 1234 Fifth Ave.

我在调试时验证了订单。然后将结果集推入一个数组,然后将其编码为json对象,并通过AJAX请求传递给我的jquery脚本。

var resultSet = [];
    $.ajax({
        async: false,
        url: 'scripts/getData.php,
        dataType: "json",
        success: function(data) {
        /* Store the pieces of the array */
        resultSet = data["php_resultSet"]; //<--Breakpoint here shows the resultSet sorted, if order is preserved here, my problem will be solved.
    }
    });

但是,当我获取数据并分析数组时,它会被排序,例如

Address: 1234 Fifth Ave., Age: 21, Name: John Age: 21

我想保留原始结果集的顺序,是否有必须设置的选项才能执行此操作?感谢帮助。

更新:

以下是构建数组并对其进行编码的PHP代码片段

    $data = array ( "otherData" => array(), "php_resultSet" => array() );

    while ( $row = sqlsrv_fetch_array ( $stmt, SQLSRV_FETCH_ASSOC ) ) {
        //Push the entire row to the result set array
        array_push ( $data["php_resultSet"], $row );
    }

    asort($someData);

    foreach ( $someData as $key) {
        array_push ( $data["otherData"], $key );
    }

return json_encode($data);//<--At this point, even though the I sorted $someData before pushing it to the $data, the php_resultSet maintains its sorted order.

3 个答案:

答案 0 :(得分:2)

猜测你的问题是因为Name: John, Age: 21, Address: 1234 Fifth Ave.表示一个关联数组,当JSON编码它变成一个对象(http://php.net/manual/en/function.json-encode.php)并且在客户端(没有代码它是在黑暗中拍摄)你使用for in构造,这里键的顺序是任意的(https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in)。为了保持顺序,您需要在PHP代码中使用非关联数组。

答案 1 :(得分:1)

将哈希(关联数组)编码为JSON时,由于源语言中哈希的表示方式不同,因此无法保证键/值对的顺序。例如,Perl中的哈希以这样的方式存储,以便以字段顺序为代价来优化存储要求。

话虽如此,有几种方法可以让JavaScript重新排序AJAX结果,一种是将结果与预期的呈现顺序一起返回,如:

{
    "presentation_order": [
        "Name",
        "Address",
        etc.
     ],
     "records": [
         {"Name":"Juan", etc.},
         etc.
     ]
}

然后使用它在填充预期显示的表格之前或之时重新排序记录。

另一种方法可能是为每个记录中的每个字段名称附加一个值,该值可用于在检索后对它们进行排序,然后在显示之前从字段名称中删除排序值。

因此,在将结果转换为JSON后,在服务器上,为第一个字段名称添加“aa_”前缀,将每个后续字段名称的前缀增加到“zz_”。因此,如果前两个字段名称是“Name”和“Address”,则变为“aa_Name”和“ab_Address”。

然后在将记录添加到客户端的表之前,按字段名称对字段进行排序,然后使用fieldName=fieldName.substring(3)删除前缀。

答案 2 :(得分:0)

从数据库中检索结果后,您可能正在构建数组。我会尝试在服务器端记录JSON字符串本身。我知道你说你在调试过程中“验证了订单”,但是不清楚你是用数据库结果集还是将数组转换成JSON字符串。