JavaScript之排序函数_动力节点Java学院整理

 更新时间:2017年06月30日 14:30:54   作者:liaoxuefeng  
排序也是在程序中经常用到的算法。这篇文章主要介绍了JavaScript之排序函数,有兴趣的可以了解一下

排序算法

排序也是在程序中经常用到的算法。无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。如果是数字,我们可以直接比较,但如果是字符串或者两个对象呢?直接比较数学上的大小是没有意义的,因此,比较的过程必须通过函数抽象出来。通常规定,对于两个元素xy,如果认为x < y,则返回-1,如果认为x == y,则返回0,如果认为x > y,则返回1,这样,排序算法就不用关心具体的比较过程,而是根据比较结果直接排序。

JavaScript的Arraysort()方法就是用于排序的,但是排序结果可能让你大吃一惊:

// 看上去正常的结果:
['Google', 'Apple', 'Microsoft'].sort(); // ['Apple', 'Google', 'Microsoft'];

// apple排在了最后:
['Google', 'apple', 'Microsoft'].sort(); // ['Google', 'Microsoft", 'apple']

// 无法理解的结果:
[10, 20, 1, 2].sort(); // [1, 10, 2, 20]

第二个排序把apple排在了最后,是因为字符串根据ASCII码进行排序,而小写字母a的ASCII码在大写字母之后。

第三个排序结果是什么鬼?简单的数字排序都能错?

这是因为Arraysort()方法默认把所有元素先转换为String再排序,结果'10'排在了'2'的前面,因为字符'1'比字符'2'的ASCII码小。

如果不知道sort()方法的默认排序规则,直接对数字排序,绝对栽进坑里!

幸运的是,sort()方法也是一个高阶函数,它还可以接收一个比较函数来实现自定义的排序。

要按数字大小排序,我们可以这么写:

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
  if (x < y) {
    return -1;
  }
  if (x > y) {
    return 1;
  }
  return 0;
}); // [1, 2, 10, 20]

如果要倒序排序,我们可以把大的数放前面:

var arr = [10, 20, 1, 2];
arr.sort(function (x, y) {
  if (x < y) {
    return 1;
  }
  if (x > y) {
    return -1;
  }
  return 0;
}); // [20, 10, 2, 1]

默认情况下,对字符串排序,是按照ASCII的大小比较的,现在,我们提出排序应该忽略大小写,按照字母序排序。要实现这个算法,不必对现有代码大加改动,只要我们能定义出忽略大小写的比较算法就可以:

var arr = ['Google', 'apple', 'Microsoft'];
arr.sort(function (s1, s2) {
  x1 = s1.toUpperCase();
  x2 = s2.toUpperCase();
  if (x1 < x2) {
    return -1;
  }
  if (x1 > x2) {
    return 1;
  }
  return 0;
}); // ['apple', 'Google', 'Microsoft']

忽略大小写来比较两个字符串,实际上就是先把字符串都变成大写(或者都变成小写),再比较。

从上述例子可以看出,高阶函数的抽象能力是非常强大的,而且,核心代码可以保持得非常简洁。

最后友情提示,sort()方法会直接对Array进行修改,它返回的结果仍是当前Array

var a1 = ['B', 'A', 'C'];
var a2 = a1.sort();
a1; // ['A', 'B', 'C']
a2; // ['A', 'B', 'C']
a1 === a2; // true, a1和a2是同一对象

相关文章

  • JavaScript图片的Base64编码以及转换详解

    JavaScript图片的Base64编码以及转换详解

    现在网站为了提升用户的浏览体验越来越多的使用了图片,而这些图片通常以 Base64 的形式存储和加载,下面这篇文章主要给大家介绍了关于JavaScript图片的Base64编码以及转换的相关资料,需要的朋友可以参考下
    2022-07-07
  • JS实现遍历不规则多维数组的方法

    JS实现遍历不规则多维数组的方法

    这篇文章主要介绍了JS实现遍历不规则多维数组的方法,涉及javascript数组递归遍历相关实现与使用技巧,需要的朋友可以参考下
    2018-03-03
  • JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)

    JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)

    下面小编就为大家带来一篇JS图片左右无缝隙滚动的实现(兼容IE,Firefox 遵循W3C标准)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-09-09
  • JS实现吸顶特效

    JS实现吸顶特效

    这篇文章主要为大家详细介绍了JS实现吸顶特效,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-01-01
  • JavaScript Pinia代替 Vuex的可行性分析

    JavaScript Pinia代替 Vuex的可行性分析

    这篇文章主要介绍了JavaScript中Pinia是否可以代替Vuex,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • JS实现可调整倒计时间代码分享

    JS实现可调整倒计时间代码分享

    这篇文章主要介绍了JS实现可调整倒计时间代码,效果很酷炫,也很具有实用价值,感兴趣的小伙伴们可以参考一下
    2015-08-08
  • JS实现的DIV块来回滚动效果示例

    JS实现的DIV块来回滚动效果示例

    这篇文章主要介绍了JS实现的DIV块来回滚动效果,结合实例形式分析了JS通过时间函数定时触发动态改变页面元素样式的相关操作技巧,需要的朋友可以参考下
    2017-02-02
  • js获取客户端网卡的IP地址、MAC地址

    js获取客户端网卡的IP地址、MAC地址

    这篇文章主要介绍了js获取客户端网卡的IP地址、MAC地址的方法,需要的朋友可以参考下
    2014-03-03
  • 细说JS数组遍历的一些细节及实现

    细说JS数组遍历的一些细节及实现

    本文主要介绍了细说JS数组遍历的一些细节及实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 至2023年最好用的兼容多浏览器的原生js复制函数copyText

    至2023年最好用的兼容多浏览器的原生js复制函数copyText

    因为后台需要增加一些复制一些内容非表单中内容,那么下面这个函数就非常的好用了,其实也是利用了表单的数据权限比较容易突破,下面是具体的实现函数,大家可以拿走
    2023-05-05

最新评论