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

 更新时间:2009年12月07日 00:58:34   作者:  
最近组里项目需要一个简单的Table排序的功能,这个功能实现起来很简单,并且网上也有很多现成的代码,因此任务很快完成。
然而在做跨浏览器的测试时在chrome浏览器下发现了一个问题,测试人员发现(见图1),在chrome下依据某列排序时,如果两行的排序数值相同,chrome不是按通常情况保持这两列的顺序不变,而是将他们顺序调换。在google一下问题之后,我们发现原来是当初ECMAscript规范中并未规定具体的sort算法,所以导致各个浏览器都有自己的sort算法,然而由于有些厂商是基于不稳定的排序算法实现的,如chrome和Mozilla/Firefox 3.0以前的排序算法都是不稳定的,不过IE是稳定的排序算法。这种算法实现的差异也导致了图表在不同浏览器下显示的结果不一致。

 

                    图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>");
}

更新后结果截图:

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

挫折就像一面墙,这面墙迫使我们向自己证明,我们是多么渴望得到这面墙后面的宝藏

相关文章

  • JS实现数组的增删改查操作示例

    JS实现数组的增删改查操作示例

    这篇文章主要介绍了JS实现数组的增删改查操作,结合实例形式分析了javascript针对数组的追加、获取、删除、添加、修改等常见操作技巧与相关注意事项,需要的朋友可以参考下
    2018-08-08
  • JS动态插入并立即执行回调函数的方法

    JS动态插入并立即执行回调函数的方法

    这篇文章主要介绍了JS动态插入并立即执行回调函数的方法,实例分析了动态插入js文件及执行回调函数的相关技巧,需要的朋友可以参考下
    2016-04-04
  • javascript判断chrome浏览器的方法

    javascript判断chrome浏览器的方法

    这篇文章主要介绍了javascript判断chrome浏览器的方法,通过userAgent判断检测一下userAgent返回的字符串里面是否包含“Chrome”,需要的朋友可以参考下
    2014-03-03
  • 浅谈js获取ModelAndView值的问题

    浅谈js获取ModelAndView值的问题

    下面小编就为大家分享一篇浅谈js获取ModelAndView值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • Html5 js实现手风琴效果

    Html5 js实现手风琴效果

    这篇文章主要为大家详细介绍了Html5 js实现手风琴效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-01-01
  • JavaScript更改class和id的方法

    JavaScript更改class和id的方法

    JavaScript允许你更改元素的class或id。当你更改之后,浏览器会自动更新元素的样式。
    2008-10-10
  • javascript+HTML5自定义元素播放焦点图动画

    javascript+HTML5自定义元素播放焦点图动画

    这篇文章主要介绍了javascript+HTML5自定义元素播放焦点图动画的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • 微信小程序实现卡片左右滑动效果的示例代码

    微信小程序实现卡片左右滑动效果的示例代码

    这篇文章主要介绍了微信小程序实现卡片左右滑动效果的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • js中小数转换整数的方法

    js中小数转换整数的方法

    js中小数转换整数的方法有很多,有下退、上进、四舍五入等等,需要的朋友可以了解下本文
    2014-01-01
  • javascript Echart可视化学习

    javascript Echart可视化学习

    这篇文章主要为大家介绍了Echart可视化学习的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01

最新评论