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 相关文章推荐
深入理解JavaScript系列(9) 根本没有“JSON对象”这回事!
Jan 15 Javascript
js编码之encodeURIComponent使用介绍(asp,php)
Mar 01 Javascript
使用Jquery实现点击文字后变成文本框且可修改
Sep 21 Javascript
使用iframe window的scroll方法控制iframe页面滚动
Mar 05 Javascript
MVC Ajax Helper或Jquery异步加载部分视图
Nov 29 Javascript
Vue自定义指令使用方法详解
Aug 21 Javascript
JavaScript实现焦点进入文本框内关闭输入法的核心代码
Sep 20 Javascript
为什么Vue3.0使用Proxy实现数据监听(defineProperty表示不背这个锅)
Oct 14 Javascript
vue.js自定义组件实现v-model双向数据绑定的示例代码
Jan 08 Javascript
JS实现横向轮播图(中级版)
Jan 18 Javascript
详解Vue3 Composition API中的提取和重用逻辑
Apr 29 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
Mar 01 Vue.js
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入门经历和学习过程分享
2014/04/11 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
科讯商业版中用到的ajax空间与分页函数
2007/09/02 Javascript
javascript removeChild 使用注意事项
2009/04/11 Javascript
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
JS类的封装及实现代码
2009/12/02 Javascript
JavaScript删除指定子元素代码实例
2015/01/13 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
js实现精美的银灰色竖排折叠菜单
2015/05/16 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
AngularJs定时器$interval 和 $timeout详解
2017/05/25 Javascript
AngularJs每天学习之总体介绍
2017/08/07 Javascript
vue如何在自定义组件中使用v-model
2018/05/14 Javascript
记一次webpack3升级webpack4的踩坑经历
2018/06/12 Javascript
Vue之beforeEach非登录不能访问的实现(代码亲测)
2019/07/18 Javascript
使用Easyui实现查询条件的后端传递并自动刷新表格的两种方法
2019/09/09 Javascript
jQuery操作动画完整实例分析
2020/01/10 jQuery
Vue登录拦截 登录后继续跳转指定页面的操作
2020/08/04 Javascript
Python实现备份文件实例
2014/09/16 Python
python opencv实现旋转矩形框裁减功能
2018/07/25 Python
Python爬虫文件下载图文教程
2018/12/23 Python
Python编写一个验证码图片数据标注GUI程序附源码
2019/12/09 Python
Python实现aes加密解密多种方法解析
2020/05/15 Python
python 读txt文件,按‘,’分割每行数据操作
2020/07/05 Python
Python3.9.1中使用match方法详解
2021/02/08 Python
CSS3 text shadow字体阴影效果
2016/01/08 HTML / CSS
BannerBuzz加拿大:在线定制横幅印刷、广告和标志
2020/03/10 全球购物
高中的自我鉴定
2013/12/16 职场文书
面试必备的求职信
2014/05/25 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
2015年小学生暑假总结
2015/07/13 职场文书
网络研修心得体会
2016/01/08 职场文书
2019年员工晋升管理制度范本!
2019/07/08 职场文书
Springboot集成阿里云OSS上传文件系统教程
2021/06/28 Java/Android
Android基础入门之dataBinding的简单使用教程
2022/06/21 Java/Android