【问题标题】:Jquery ajax returns data sortedjQuery ajax 返回排序后的数据
【发布时间】:2011-09-26 23:22:28
【问题描述】:

我有一个从数据库中获取数据的 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 代码的 sn-p

    $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.

【问题讨论】:

    标签: javascript jquery


    【解决方案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) 删除前缀。

    【讨论】:

    • Rob Raisch:“然后在客户端将记录添加到表之前,按字段名称对字段进行排序,然后使用 fieldName=fieldName.substring( 3)。 Rob,我们如何在客户端进行排序?
    • temirbek:通过使用内在的 Array.prototype.sort() 或编写您自己的自定义排序器。在第一种情况下,您可以: ['this','that','and','the','other','thing'].sort() 产生:["and", "other", "那”、“那个”、“事物”、“这”]。见developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…
    【解决方案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 代码中使用非关联数组。

    【讨论】:

      【解决方案3】:

      这可能与您在从数据库中检索结果后构建数组的方式有关。我会尝试在服务器端记录 JSON 字符串本身。我知道您说您在调试期间“验证了顺序”,但不清楚您是使用 DB 结果集还是正在转换为 JSON 字符串的数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-20
        • 2015-08-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多