1

我从 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 进行排序,似乎 - 下面的 RHS 列是横幅 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]
4

2 回答 2

0

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

于 2013-04-19T10:24:50.750 回答
0

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

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

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

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

于 2013-04-19T10:27:02.653 回答