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 相关文章推荐
jQuery实现原理的模拟代码 -6 代码下载
Aug 16 Javascript
jQuery结合HTML5制作的爱心树表白动画
Feb 01 Javascript
jQuery插件datalist实现很好看的input下拉列表
Jul 14 Javascript
基于JavaScript代码实现随机漂浮图片广告
Jan 05 Javascript
JS中使用变量保存arguments对象的方法
Jun 03 Javascript
Node.js编写CLI的实例详解
May 17 Javascript
BootStrap的双日历时间控件使用
Jul 25 Javascript
利用jqprint插件打印页面内容的实现方法
Jan 09 Javascript
详解@angular/cli 改变默认启动端口两种方式
Nov 29 Javascript
JavaScript文本特效实例小结【3个示例】
Dec 22 Javascript
在layer弹层layer.prompt中,修改placeholder的实现方法
Sep 27 Javascript
关于IDEA中的.VUE文件报错 Export declarations are not supported by current JavaScript version
Oct 17 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
经典的PHPer为什么被认为是草根?
2007/04/02 PHP
PHP 5.3.1 安装包 VC9 VC6不同版本的区别是什么
2010/07/04 PHP
PHP备份数据库生成SQL文件并下载的函数代码
2012/02/05 PHP
浅析php变量修饰符static的使用
2013/06/28 PHP
php基于session锁防止阻塞请求的方法分析
2017/08/07 PHP
动手学习无线电
2021/03/10 无线电
Js基础学习资料
2010/11/23 Javascript
圣诞节Merry Christmas给博客添加浪漫的下雪效果基于jquery实现
2012/12/27 Javascript
js中直接声明一个对象的方法
2014/08/10 Javascript
jQuery的text()方法用法分析
2014/12/20 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
jQuery简单实现input文本框内灰色提示文本效果的方法
2015/12/02 Javascript
p5.js入门教程之平滑过渡(Easing)
2018/03/16 Javascript
Vue axios设置访问基础路径方法
2018/09/19 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
浅谈vue 锚点指令v-anchor的使用
2019/11/13 Javascript
Python的类实例属性访问规则探讨
2015/01/30 Python
python分析nignx访问日志脚本分享
2015/02/26 Python
在Python中合并字典模块ChainMap的隐藏坑【推荐】
2019/06/27 Python
python实现画出e指数函数的图像
2019/11/21 Python
哪些是python中web开发框架
2020/06/17 Python
为什么python比较流行
2020/06/19 Python
详解Python中openpyxl模块基本用法
2021/02/23 Python
Aeropostale官网:美国著名校园品牌及青少年服饰品牌
2019/03/21 全球购物
机械化及自动化毕业生的自我评价分享
2013/11/06 职场文书
运动会广播稿300字
2014/01/10 职场文书
父亲追悼会答谢词
2014/01/17 职场文书
生产文员岗位职责
2014/04/05 职场文书
贷款委托书范本
2014/04/08 职场文书
设计大赛策划方案
2014/06/13 职场文书
五年级学生期末评语
2014/12/26 职场文书
2015年财务工作总结范文
2015/03/31 职场文书
2015年班组长工作总结
2015/04/10 职场文书
Python绘制地图神器folium的新人入门指南
2021/05/23 Python
使用RedisTemplat实现简单的分布式锁
2021/11/20 Redis
win11怎么用快捷键锁屏? windows11锁屏的几种方法
2021/11/21 数码科技