JavaScript Sort 的一个错误用法示例

 更新时间:2015年03月20日 09:10:52   投稿:junjie  
这篇文章主要介绍了JavaScript Sort 的一个错误用法示例,本文分析了一个Sort实例得到了这个错误用法并给出了解决方法,需要的朋友可以参考下

前不久同事的代码中出了一个很神奇的问题,大致流程是对一个由对象组成的数组进行排序,其中属性 a 用于排序,属性 b 作为一个优选条件,当 b 等于 1 的时候无论 a 值是什么,都排在开头 。这本是一个很简单的问题,问题就在于他用两次 sort 实现在这次排序,先根据 a 的属性排序,然后再根据 b 的值来排序。问题就出在第二次排序中。

我们想当然的会认为在第一次排序中,数组已经根据 a 的属性由大到小排序,在第二次中我们只要不去动原数组的顺序就行(一般在方法中写成返回0或-1),只考虑单独把 b 等于 1 的元素提到前面去。但是其实这与语言所选用的排序算法有关,javascript (和一起其他语言)内置的 sort 方法采用的是几种排序算法的集合,有时并不能保证相同元素的位置保持一致。

下面是从 stackoverflow 上面找来的一个例子

复制代码 代码如下:

var arrayToSort = [
  {name: 'a', strength: 1}, {name: 'b', strength: 1}, {name: 'c', strength: 1}, {name: 'd', strength: 1},
  {name: 'e', strength: 1}, {name: 'f', strength: 1}, {name: 'g', strength: 1}, {name: 'h', strength: 1},
  {name: 'i', strength: 1}, {name: 'j', strength: 1}, {name: 'k', strength: 1}, {name: 'l', strength: 1},
  {name: 'm', strength: 1}, {name: 'n', strength: 1}, {name: 'o', strength: 1}, {name: 'p', strength: 1},
  {name: 'q', strength: 1}, {name: 'r', strength: 1}, {name: 's', strength: 1}, {name: 't', strength: 1}
];

arrayToSort.sort(function (a, b) {
  return b.strength - a.strength;
});

arrayToSort.forEach(function (element) {
  console.log(element.name);
});

我们会以为最后元素的值还是从 a 到 t,但实际运行下来的结果却是乱序的,这是因为 sort 的算法并没有保留原数组的顺序,也即 unstable。

那么我们就该尽量避免这种情况发生,就我同事的例子,将两次 sort 的逻辑合并在一次中应该是个可行的办法,如果必须分为多次 sort,那么就把原数组的顺序记录在元素的属性上把。

相关文章

  • layui自定义工具栏的方法

    layui自定义工具栏的方法

    今天小编就为大家分享一篇layui自定义工具栏的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-09-09
  • 引用外部js乱码问题分析及解决方案

    引用外部js乱码问题分析及解决方案

    web开发中不可避免会使用js,为了给页面良好的瘦身我们一般都会将js代码放在外部,然后通过src引用,如果web页面与js采用的编码不同一就会产生乱码,接下来与大家分享下解决方法,感兴趣的朋友可以参考下哈
    2013-04-04
  • javascript实现链接单选效果的方法

    javascript实现链接单选效果的方法

    这篇文章主要介绍了javascript实现链接单选效果的方法,可实现点击链接改变其背景色的功能,同时可禁用对应链接的跳转,需要的朋友可以参考下
    2015-05-05
  • JavaScript事件代理和委托详解

    JavaScript事件代理和委托详解

    这篇文章主要为大家详细介绍了JavaScript事件代理和委托,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • JavaScript对象解构的用法实例解析

    JavaScript对象解构的用法实例解析

    解构赋值允许你使用类似数组或对象字面量的语法将数组和对象的属性赋给各种变量,下面这篇文章主要给大家介绍了关于JavaScript对象解构用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-01-01
  • 详解js模板引擎art template数组渲染的方法

    详解js模板引擎art template数组渲染的方法

    art-template 是一个简约、超快的模板引擎。这篇文章主要介绍了详解js模板引擎art template数组渲染的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • JavaScript实现MD5加密的六种方式实例

    JavaScript实现MD5加密的六种方式实例

    这篇文章主要给大家介绍了关于JavaScript实现MD5加密的六种方式,在JS中可以实现MD5加密算法,可以使用第三方库或者自己编写代码实现,需要的朋友可以参考下
    2023-09-09
  • 微信小程序学习(4)-系统配置app.json详解

    微信小程序学习(4)-系统配置app.json详解

    我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多 tab 等。
    2017-01-01
  • js如何监听input输入事件及使用防抖封装函数处理方法

    js如何监听input输入事件及使用防抖封装函数处理方法

    这篇文章主要给大家介绍了关于js如何监听input输入事件及使用防抖封装函数处理方法的相关资料,最近有一个需求,需要我们实时监听input输入框中的内容,从而带来更好的用户体验,需要的朋友可以参考下
    2023-07-07
  • 浅谈JS中的bind方法与函数柯里化

    浅谈JS中的bind方法与函数柯里化

    下面小编就为大家带来一篇浅谈JS中的bind方法与函数柯里化。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-08-08

最新评论