Chrome浏览器 - ajax响应中不需要的数据排序

时间:2013-04-19 10:11:29

标签: php google-chrome

我使用AJAX处理程序代码(PHP)中的json_encode返回一个横幅数组 -

echo json_encode(array("bannersData" =>$bannersData));

当数据被回显时,数据的顺序是正确的。

但是,在AJAX响应处理代码(javascript部分)中,我在chrome版本26.0.1410.64 m中获得了对返回对象的不同排序(按照标题ID排序)。我不确定我们是否有任何选择来强制保持原始排序顺序不变。

以下是代码 -

$.ajax({
type: "POST",
async: false,
url: posturl,
data:postdata,
dataType: "json",
success: function(msg){

    if($.isEmptyObject(msg.bannersData))
    {
        bannerOptionsHtml = "No Banner available";  
    }
    else
    {
        /*getting unexpectedly sorted result here*/

    }

});

示例数据

输入

当我echo json_encode()时,以下是数据的原始排序 -

'fggd'             [12658]
banner 2           [12653]
Copy 2 of banner 1 [12655]
Copy 3 of banner 1 [12656]
Copy 4 of banner 1 [12657]
sdfds = 'xyz'      [12654]

输出

但是,以下是我在AJAX响应中得到的结果 -

在chrome中(根据横幅ID进行排序,似乎 - 下面的R.H.S.列是横幅ID)

Test                [12652]
banner 2            [12653]
sdfds = 'xyz'       [12654]
Copy 2 of banner 1  [12655]
Copy 3 of banner 1  [12656]
Copy 4 of banner 1  [12657]
'fggd'              [12658]

在firefox中(正如预期的那样)

'fggd'             [12658]
banner 2           [12653]
Copy 2 of banner 1 [12655]
Copy 3 of banner 1 [12656]
Copy 4 of banner 1 [12657]
sdfds = 'xyz'      [12654]

2 个答案:

答案 0 :(得分:0)

您是否尝试将数字键转换为PHP数组中的String? 似乎Chrome排序了int keys数组(与opera相同的问题)

答案 1 :(得分:0)

您能提供实际拥有的JSON对象的格式吗?我打赌1英镑bannersData实际上是作为一个数组传输而不是作为对象。

浏览器遵循从JSON字符串重新创建对象的标准,此标准命令浏览器保持键值顺序不变。但是,不是数组的情况,并且绝对没有标准。因此,浏览者对此有所不同。

这不是一个模糊的事实:How do you stop Chrome and Opera sorting JSON objects by Index ASC?是你问题的副本(我可能会这样投票)。

两个解决方案:将您的数组从PHP转换为具有键值对的对象(即使键是数字!)以保持顺序,或者理解订单不会保留在所有浏览器中。第一个选项不需要JS代码更改,除非您使用整数迭代循环(for (var i = 0; i < array.length; i++) {,此时您需要迭代对象的键而不是对象本身。