可能学js的朋友都知道,sort()在js中是用来排序的,但真正用起来,又不是那么的得心应手,为什么呢,那是因为你没有真正的理解它。如果你真的懂得了它内部的实现机制,那我相信你用起来应该就没那么难了。下面就让我们来一起了解一下sort()吧。

sort() 方法用于对数组的元素进行排序。语法:arrayObject.sort(sortby);参数sortby可选,规定排序顺序,必须是函数。很多网上的文章都说,如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。其实不是精确不精确的问题,当没传递参数时,sort()方法会调用比较项的每一项的toString()方法,将他们转换成字符串,再根据他们的字符编码排序。虽然这两个解释道理差不多,但它的默认比较原理确实是后者。这就是为什么当我们在对一个纯数字数组进行排序时,如果不传入一个比较函数的话,得到的结果既不是升序,也不是降序的原因。例如:

如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,对于比较函数该怎么定义,请遵循这样的原则:

如果a<b,而你想a排在b的前面,即所谓的按升序排列,那么你函数的内部返回值应该是个负数,最简单的函数体就是return a – b;因为a<b,a-b自然为负数了。

如果a<b,而你想a排在b的后面,即所谓的按降序排列,那么你函数的内部返回值应该是个正数数,最简单的函数体就是return b- a;因为a<b,b-a自然就是个正数了。

如果a = b,则排不排顺序都一样,就随你怎么定义函数体了。

如下:

也许有的朋友还是不明白,明明是两个两个的比较,这怎么就排好序了呢?其实,虽然每次只比较两个数,但比较的次数却不止一次,因为它内部采用的是冒泡排序,数组里面的任何两个数都进行过比较,然后才得出了你想要的结果。下面以var arr = [5,10,40,25,1000,1]为例,展示其升序排序过程。

首先
arr[0] = “5”
arr[1] = “10”
那么 a=5 b=10,
显然a > b,那么sort根据这个函数返回的结构,就开始排了,
5, 10
那么第一次结束时: 5 10 40 25 1000 1
接下来:然后5 跟 40 25 1000 1排,
完了只有是: 1 10 40 25 1000 5
然后从10 开始,跟其后面的逐一比较,10 – 40 ,10 <->25 ,10 <-> 1000 ,10 <->5,
结束后:1 5 40 25 1000 10
再40 : 1 5 10 25 1000 40
再 25 :
再 1000 : 1 5 10 25 40 1000
到此,最后一位就剩一个了,没有啥比较的了,排序完成,得最终结果:1,5,10,25,40,1000。