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的变量作用域深入理解
Oct 25 Javascript
jquery ready()的几种实现方法小结
Jun 18 Javascript
让你的博文自动带上缩址的实现代码,方便发到微博客上
Dec 28 Javascript
JS时间选择器 兼容IE6,7,8,9
Jun 26 Javascript
javascript显示中文日期的方法
Jun 18 Javascript
JS Array.slice 截取数组的实现方法
Jan 02 Javascript
结合代码图文讲解JavaScript中的作用域与作用域链
Jul 05 Javascript
JavaScript实现微信号随机切换代码
Mar 09 Javascript
js console.log打印对象时属性缺失的解决方法
May 23 Javascript
解决layui表格内文本超出隐藏的问题
Sep 12 Javascript
解决新建一个vue项目过程中遇到的问题
Oct 22 Javascript
Vue3 Composition API的使用简介
Mar 29 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数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
PHP使用正则表达式获取微博中的话题和对象名
2015/07/18 PHP
开启PHP的伪静态模式
2015/12/31 PHP
详解HTTP Cookie状态管理机制
2016/01/14 PHP
PHP 使用 Imagick 裁切/生成缩略图/添加水印自动检测和处理 GIF
2016/02/19 PHP
php实现的中文分词类完整实例
2017/02/06 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
php文件上传原理与实现方法详解
2019/12/20 PHP
js left,right,mid函数
2008/06/10 Javascript
js 匿名调用实现代码
2009/06/19 Javascript
基于JQuery.timer插件实现一个计时器
2010/04/25 Javascript
jQuery 常见操作实现方式和常用函数方法总结
2011/05/06 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
JS只能输入正整数的简单实例
2016/10/07 Javascript
iOS + node.js使用Socket.IO框架进行实时通信示例
2017/04/14 Javascript
ES6学习教程之Map的常用方法总结
2017/08/03 Javascript
nodejs简单读写excel内容的方法示例
2018/03/16 NodeJs
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
JS实现手风琴特效
2020/11/08 Javascript
Vue 使用iframe引用html页面实现vue和html页面方法的调用操作
2020/11/16 Javascript
python实现的登录和操作开心网脚本分享
2014/07/09 Python
python基础教程之Hello World!
2014/08/29 Python
Python 通过URL打开图片实例详解
2017/06/01 Python
Python3编程实现获取阿里云ECS实例及监控的方法
2017/08/18 Python
python实现微信机器人: 登录微信、消息接收、自动回复功能
2019/04/29 Python
PyQt5 在label显示的图片中绘制矩形的方法
2019/06/17 Python
Python实现微信翻译机器人的方法
2019/08/13 Python
python计算n的阶乘的方法代码
2019/10/25 Python
python pygame实现球球大作战
2019/11/25 Python
Python timeit模块的使用实践
2020/01/13 Python
python ffmpeg任意提取视频帧的方法
2020/02/21 Python
2020最新pycharm汉化安装(python工程狮亲测有效)
2020/04/26 Python
Jupyter notebook命令和编辑模式常用快捷键汇总
2020/11/17 Python
行政专员岗位职责说明书
2014/07/30 职场文书
信用卡结清证明怎么写
2014/09/13 职场文书
python基于tkinter实现gif录屏功能
2021/05/19 Python