javascript Array.sort() 跨浏览器下需要考虑的问题


Posted in Javascript onDecember 07, 2009

然而在做跨浏览器的测试时在chrome浏览器下发现了一个问题,测试人员发现(见图1),在chrome下依据某列排序时,如果两行的排序数值相同,chrome不是按通常情况保持这两列的顺序不变,而是将他们顺序调换。在google一下问题之后,我们发现原来是当初ECMAscript规范中并未规定具体的sort算法,所以导致各个浏览器都有自己的sort算法,然而由于有些厂商是基于不稳定的排序算法实现的,如chrome和Mozilla/Firefox 3.0以前的排序算法都是不稳定的,不过IE是稳定的排序算法。这种算法实现的差异也导致了图表在不同浏览器下显示的结果不一致。

 javascript Array.sort() 跨浏览器下需要考虑的问题javascript Array.sort() 跨浏览器下需要考虑的问题

                    图1:数组左边的数字表示它初始化时候的顺序

思考了一下,我和组里另外一个成员分别给出了自己的解决方法,他的意见是通过自己实现具体的sort算法来统一控制,鉴于网上的现成的排序算法很多并且排序算法是程序员的基础,这种方式实现起来并不复杂,唯一的工作就是代码的实现。不过我认为其实有更简单的方法,因为我们的数据是基于XSLT从xml中解析出来的,而XSLT是知道每行数据的的序号的(当然如果是由服务器端代码从数据库或webservice读取一样很容易取该值),所以我认为可以在XSLT中给每列添加一个Index属性,e.g.第一行Index=1,第二行Index=2...这样在sort比较大小的时候如果发现两个数值相同,则比较其行号,这样最终只需要在在比较函数中添加两行代码即可实现。下面是实现代码和结果截图:

var array = [ 
{Index:1,val:25}, 
{Index:2,val:25}, 
{Index:3,val:45}, 
{Index:4,val:78}]; 
array.sort(function(a, b) { 
if (a.val === b.val) { 
//此处两值相同,则根据其行号(初始化时的索引值)进行比较。 
return a.Index - b.Index; 
} 
return a.val - b.val; 
}) 
for (var i = 0; i < array.length; i++) { 
document.write("<p>" + array[i].Index + ":" + array[i].val + "</p>"); 
}

更新后结果截图:

javascript Array.sort() 跨浏览器下需要考虑的问题javascript Array.sort() 跨浏览器下需要考虑的问题

当然这只是解决方法之一,我的目的只是尽量减少我们需要维护的代码量,这样可以尽量减少bug。一个思路,希望对你有所帮助。

挫折就像一面墙,这面墙迫使我们向自己证明,我们是多么渴望得到这面墙后面的宝藏
Javascript 相关文章推荐
轻量级 JS ToolTip提示效果
Jul 20 Javascript
js弹出框轻量级插件jquery.boxy使用介绍
Jan 15 Javascript
jQuery筛选器children()案例详解(图文)
Feb 17 Javascript
jquery导航制件jquery鼠标经过变色效果示例
Dec 05 Javascript
js调用后台、后台调用前台等方法总结
Apr 17 Javascript
Vue数据驱动模拟实现4
Jan 12 Javascript
Bootstrap Table使用整理(一)
Jun 09 Javascript
Vue-CLI3.x 设置反向代理的方法
Dec 06 Javascript
微信小程序之 catalog 切换实现解析
Sep 12 Javascript
vue的路由映射问题及解决方案
Oct 14 Javascript
js实现聊天对话框
Feb 08 Javascript
js实现类选择器和name属性选择器的示例步骤
Feb 07 Javascript
IE7中javascript操作CheckBox的checked=true不打勾的解决方法
Dec 07 #Javascript
js event事件的传递与冒泡处理
Dec 06 #Javascript
IE和firefox浏览器的event事件兼容性汇总
Dec 06 #Javascript
js 操作select相关方法函数
Dec 06 #Javascript
JavaScript 对象模型 执行模型
Dec 06 #Javascript
ASP Json Parser修正版
Dec 06 #Javascript
jquery ready函数源代码研究
Dec 06 #Javascript
You might like
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
深入浅出讲解:php的socket通信原理
2016/12/03 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
JavaScript 节点操作 以及DOMDocument属性和方法
2007/12/06 Javascript
DOM 脚本编程中的兄弟节点
2009/10/31 Javascript
关于javascript DOM事件模型的两件事
2010/07/22 Javascript
谈谈关于JavaScript 中的 MVC 模式
2013/04/11 Javascript
IE下写xml文件的两种方式(fso/saveAs)
2013/08/05 Javascript
IE浏览器中图片onload事件无效的解决方法
2014/04/29 Javascript
node.js使用cluster实现多进程
2016/03/17 Javascript
微信js-sdk界面操作接口用法示例
2016/10/12 Javascript
完美解决jQuery fancybox ie 无法显示关闭按钮的问题
2016/11/29 Javascript
Vue数据驱动模拟实现1
2017/01/11 Javascript
node.js中express-session配置项详解
2017/05/31 Javascript
jQuery除指定区域外点击任何地方隐藏DIV功能
2017/11/13 jQuery
在angular 6中使用 less 的实例代码
2018/05/13 Javascript
详解nodejs http请求相关总结
2019/03/31 NodeJs
vue-simple-uploader上传成功之后的response获取代码
2020/09/07 Javascript
Python中tell()方法的使用详解
2015/05/24 Python
python与C互相调用的方法详解
2017/07/14 Python
TensorFlow在MAC环境下的安装及环境搭建
2017/11/14 Python
Windows环境下python环境安装使用图文教程
2018/03/13 Python
对Python中画图时候的线类型详解
2019/07/07 Python
Python退出时强制运行一段代码的实现方法
2020/04/29 Python
Django数据统计功能count()的使用
2020/11/30 Python
解决pytorch 保存模型遇到的问题
2021/03/03 Python
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
Currentbody美国/加拿大:美容仪专家
2020/03/09 全球购物
金融行业职业生涯规划范文
2014/01/17 职场文书
雷锋式好少年事迹材料
2014/08/17 职场文书
限期整改通知书
2015/04/22 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
推销搭讪开场白
2015/05/28 职场文书
多属性、多分类MySQL模式设计
2021/04/05 MySQL
vue3中provide && inject的使用
2021/07/01 Vue.js