jQuery parseJson 对象方向(IE 和 Firefox 与 Opera 和 Chrome)

标签 jquery json sorting direction

AJAX 请求返回 JSON 字符串,例如:{"1015": {此处有一些数据},"1001": {此处有一些数据} - 它是 JSON 编码的 PHP 数组。

jQuery.parseJSON 函数返回 Javascript 对象并查看问题出在哪里: IE8和FF4返回具有相同元素顺序的对象:1015, 1001(我认为这是正确的方法),但Opera11和Chrome14返回具有相反顺序的对象:1001, 1015(但进行的JSON字符串是相同的)。

这个问题有解决办法吗?

最佳答案

这不是浏览器问题,而是数据结构的滥用。

数组是一组有序的对象。根据定义,JavaScript 集合/对象是一个无序集合。 ECMA 标准支持这一点。

关于 chromium V8 项目有一个相对古老的问题,对此主题进行了长时间的讨论:http://code.google.com/p/v8/issues/detail?id=164

其要点是 Chrome 和 Opera(实际上还有 IE9)对对象的数字键成员进行排序,并将它们放置在任何具有字符串键的成员之前。这样做是出于访问对象时的效率原因,并且它在这些浏览器中按预期工作。 FF 和 IE < 9 保留了不应排序的结构的顺序,虽然它们没有做错什么,但这种行为不如 Chrome、Opera 和 IE9 正确。

您基本上可以通过三种方法在项目中解决此问题:

  1. 对数据调用 array_values() 以使其不关联。什么时候 你对它进行 json_encode,默认情况下它将被编码为数组。这 order 将是 PHP 中定义的任何顺序。自从 您不想丢失 key ,您应该将它们存放在 对象数据。这是首选解决方案,也是最不可能的解决方案 打破长期。

  2. 定义您希望数据的顺序并将其作为 数组以及您的对象数据。不如上面的那么好,因为 你最终传递的数据比你真正需要的多,它改变了 给客户带来负担。

  3. 将您的键转换为带有一些字母字符的字符串 每个键的开始或结束。如果您是这样的话,这只是一个不错的选择 处理遗留项目并且几乎无法控制您的 架构。

事实是,作为开发人员,您无法保证无序对象的顺序将被保留。随着网络标准朝着这个方向发展,并且 ECMA 标准和 future 标准草案继续制定规则,其他浏览器将转向这种行为。不妨现在就调整一下。

这个故事的寓意:如果需要保持顺序,请使用数组。

关于jQuery parseJson 对象方向(IE 和 Firefox 与 Opera 和 Chrome),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7881718/

相关文章:

javascript - Contenteditable 高度过渡

javascript - 如何将前端值传递给 JavaScript 计数器?

php - 如何在 div(幻灯片)和 Kiosk 数据问题上设置 setTimeout/delay

json - swift - 将 json 类型 Int 转换为 String

c++ - 分拣程序

javascript - element.style.backgroundColor 不适用于 WordPress

javascript - JSON.parse 是如何工作的?

javascript - 在 NodeJS 和 Typescript 中从 csv 转换为 json 后如何打印 json 数组中的单个键和值

c# - 如何使用自定义比较器以不同的词法顺序对数组进行排序?

algorithm - 选择算法运行时