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


Chrome browser - unwanted sorting of data in ajax response

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

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]
<<p> 输出/em>

但是,以下是我在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]

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

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

浏览器遵循一个标准来从JSON字符串重新创建对象,该标准要求浏览器保持键值顺序完整。然而,对于数组来说,不是这种情况,并且在这些方面绝对没有标准。因此,浏览器对此有不同的看法。

这不是一个模糊的事实:你如何阻止Chrome和Opera排序JSON对象的索引ASC?是你问题的副本(我可能会这样投票)。

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