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等比例缩放图片控制超出范围的图片
Aug 06 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
Aug 14 Javascript
js实现的二级横向菜单条实例
Aug 22 Javascript
JavaScript+CSS实现仿天猫侧边网页菜单效果
Aug 25 Javascript
discuz表情的JS提取方法分析
Mar 22 Javascript
微信小程序radio组件使用详解
Jan 31 Javascript
Vue项目分环境打包的实现步骤
Apr 02 Javascript
Angular 容器部署的方法
Apr 17 Javascript
Vue props 单向数据流的实现
Nov 06 Javascript
如何让node运行es6模块文件及其原理详解
Dec 11 Javascript
分享一款超好用的JavaScript 打包压缩工具
Apr 26 Javascript
全面解析Vue中的$nextTick
Dec 24 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
自动把纯文本转换成Web页面的php代码
2009/08/27 PHP
PHP实现生成唯一编号(36进制的不重复编号)
2014/07/01 PHP
PHP数组遍历知识汇总(包含遍历方法、数组指针操作函数、数组遍历测速)
2014/07/05 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
yii2.0使用Plupload实现带缩放功能的多图上传
2015/12/22 PHP
YII CLinkPager分页类扩展增加显示共多少页
2016/01/29 PHP
ajax+php实现无刷新验证手机号的实例
2017/12/22 PHP
jQuery textarea的长度进行验证
2009/05/06 Javascript
FF IE兼容性的修改小结
2009/09/02 Javascript
简单实例处理url特殊符号&amp;处理(2种方法)
2013/04/02 Javascript
jquery选择器之属性过滤选择器详解
2014/01/27 Javascript
JavaScript代码复用模式详解
2014/11/07 Javascript
JS实现的另类手风琴效果网页内容切换代码
2015/09/08 Javascript
基于JavaScript代码实现pc与手机之间的跳转
2015/12/23 Javascript
Jquery attr()方法 属性赋值和属性获取详解
2016/04/15 Javascript
基于JS+Canves实现点击按钮水波纹效果
2016/09/15 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
基于js原生和ajax的get和post方法以及jsonp的原生写法实例
2017/10/16 Javascript
AngularJs 禁止模板缓存的方法
2017/11/28 Javascript
vue框架搭建之axios使用教程
2018/07/11 Javascript
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
Python中集合类型(set)学习小结
2015/01/28 Python
利用python操作SQLite数据库及文件操作详解
2017/09/22 Python
Python和Java进行DES加密和解密的实例
2018/01/09 Python
Sanic框架路由用法实例分析
2018/07/16 Python
Python Pillow.Image 图像保存和参数选择方式
2020/01/09 Python
python:目标检测模型预测准确度计算方式(基于IoU)
2020/01/18 Python
canvas压缩图片以及卡片制作的方法示例
2018/12/04 HTML / CSS
Reebok官方旗舰店:美国知名健身品牌锐步
2019/01/07 全球购物
便利店投资的创业计划书
2014/01/12 职场文书
大学奖学金获奖感言
2014/08/15 职场文书
环境保护建议书
2014/08/26 职场文书
2015年求职自荐信范文
2015/03/04 职场文书
2016党员发展对象培训心得体会
2016/01/08 职场文书
观看《杨善洲》宣传教育片心得体会
2016/01/23 职场文书