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,那么就把原数组的顺序记录在元素的属性上把。

相关文章

  • 基于JS编写一个看字说颜色小游戏

    基于JS编写一个看字说颜色小游戏

    这篇文章主要为大家分享了一个看字说颜色的小游戏,游戏是利用JS语言编写实现的,文中的示例代码讲解详细,感兴趣的小伙伴可以学习一下
    2022-04-04
  • 微信小程序实现时间进度条功能

    微信小程序实现时间进度条功能

    这篇文章主要为大家详细介绍了微信小程序实现时间进度条功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-11-11
  • PHP abstract与interface之间的区别

    PHP abstract与interface之间的区别

    本文是对PHP中abstract与interface之间的区别进行了详细的分析介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-11-11
  • Javascript实现字数统计

    Javascript实现字数统计

    现在流行的Twitter等微博客网站,有一个很好的用户体验,就是在文本框中输入文字的时候,会自动统计输入的字符,并显示用户还能输入的字符,在限制了140个字的微博客中,这样的小提示可以很好的增强用户体验。
    2015-07-07
  • 原生JS实现Ajax跨域请求flask响应内容

    原生JS实现Ajax跨域请求flask响应内容

    这篇文章主要为大家详细介绍了JS实现Ajax跨域请求flask响应内容,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-10-10
  • 如何让一个层关闭之后,就算刷新页面了也不显示。除非关闭页面再次打开

    如何让一个层关闭之后,就算刷新页面了也不显示。除非关闭页面再次打开

    这个功能,一般可用于广告的显示,当关闭后,就不显示,除非重新关闭打开,增加用户体验
    2008-09-09
  • 原生js三级联动的简单实现代码

    原生js三级联动的简单实现代码

    下面小编就为大家带来一篇原生js三级联动的简单实现代码。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • 微信小程序如何获取手机验证码

    微信小程序如何获取手机验证码

    这篇文章主要为大家详细介绍了微信小程序如何获取手机验证码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-11-11
  • js 代码集(学习js的朋友可以看下)

    js 代码集(学习js的朋友可以看下)

    js 代码集 学习js的朋友可以看下,功能比较多,大家可以自己选择。
    2009-07-07
  • 微信小程序嵌入H5页面(web-view)的方法详解

    微信小程序嵌入H5页面(web-view)的方法详解

    使用<web-view>标签能在小程序中打开外部网页,但是要打开的网页的域名必须跟小程序的业务域名(业务域名可以在小程序的后台管理界面添加)一致,否则在真机上是打不开的,下面这篇文章主要给大家介绍了关于微信小程序嵌入H5页面(web-view)的相关资料,需要的朋友可以参考下
    2022-09-09

最新评论