JavaScript sort() 方法
实例
数组排序:
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
fruits.sort();
fruits 输出结果:
Apple,Banana,Mango,Orange
尝试一下 »
定义和用法
sort() 方法用于对数组的元素进行排序。
排序顺序可以是字母或数字,并按升序或降序。
默认排序顺序为按字母升序。
注意:当数字是按字母顺序排列时"40"将排在"5"前面。
使用数字排序,你必须通过一个函数作为参数来调用。
函数指定数字是按照升序还是降序排列。
这些说起来可能很难理解,你可以通过本页底部实例进一步了解它。
注意: 这种方法会改变原始数组!。
浏览器支持
所有主要浏览器都支持sort()。
语法
array.sort(sortfunction)
参数 Values
参数 | 描述 |
---|---|
sortfunction | 可选。规定排序顺序。必须是函数。 |
返回值
Type | 描述 |
---|---|
Array | 对数组的引用。请注意,数组在原数组上进行排序,不生成副本。 |
技术细节
JavaScript Version: | 1.1 |
---|
更多实例
实例
数字排序(数字和升序):
var points = [40,100,1,5,25,10];
points.sort(function(a,b){return a-b});
points.sort(function(a,b){return a-b});
points 输出结果:
1,5,10,25,40,100
尝试一下 »
实例
数字排序(数字和降序):
var points = [40,100,1,5,25,10];
points.sort(function(a,b){return b-a});
points.sort(function(a,b){return b-a});
points 输出结果:
100,40,25,10,5,1
尝试一下 »
实例
数字排序 (字母和降序):
var fruits = ["Banana", "Orange", "Apple", "Mango"];
fruits.sort();
fruits.reverse();
fruits.sort();
fruits.reverse();
fruits 输出结果:
Orange,Mango,Banana,Apple
尝试一下 »
路人乙
305***8979@qq.com
这个 sort() 方法,如果看上面的例子会非常痛苦。
sort() 方法,有一个可选参数,必须是函数,供它调用。那么就是个回调函数咯!
回调函数的参数要有两个:第一个参数的元素肯定在第二个参数的元素前面!!!
这个方法的排序是看回调函数的返回值:
例子:
路人乙
305***8979@qq.com
panlf
364***434@qq.com
降序排列:
尝试一下 »
panlf
364***434@qq.com
huangyifan
546***203@qq.com
这里纠正一下第一个网友的笔记:
首先,第一个参数并不是在第二个参数前面,恰恰相反,参数 b 始终在参数 a 的前面。即第一比较 a>b 其实比较的是 7>9。
第一次比较:7>9,结果为 false,即 return -1,此时 a 会换到 b 前面,即 7 在 9 之前,所以位置互换,并不是这位网友说的 a>b 位置互换,而是 a<b 位置互换。
但是最后输出的结果一样,是因为 a、b 循序理解反了,然后关于 return 结果导致位置交换的概念也弄反了,反反得正,结果就一样了。
huangyifan
546***203@qq.com
杨shuai
175***8771@qq.com
去重升序:
杨shuai
175***8771@qq.com
九亿少女脚臭
pp7***74714@gmail.com
1.升序(从小到大)
这里就是我们自己可以用一个比较函数(回调函数)来设置排序规则,用返回值来告诉这个方法,在进行两个数字比较的时候,交不交换位置:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2.那么降序(从大到小),也就简单了:
另外提一句:a,b相等,不换位置,这里换不换都无所谓,毕竟相等。不过不同的浏览器可能有的交换位置,有的不交换,不过这个我们不需要关心。
有个问题产生
其实不同的浏览器对这个sort排序方法的实现是不一样的,火狐用的是归并排序,谷歌用的是改进版快速排序。
提这句话,是因为开始遇到一个问题:
上面代码把数组的元素取出来,作为实参传递给function这个函数的形参a,b输出时,在不同的浏览器,a和b的值是不一样的:
在火狐会输出:a = 5; b = 4;
在谷歌/ie/edge:a = 4; b = 5;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
产生错误的过程:
我是在谷歌浏览器进行调试的,所以开始跟sort方法的结论一样,我以为 a = 数组前一个值,b=数组后一个值,那么就是a = 5,b = 4.
然而在谷歌浏览器输出却是a = 4,b = 5,然后我刚好又看到我楼上那位兄弟说的,应该是b应该都是在a的前面,也就是arr = [第一个,第二个],这样它取元素不就是b=第一个,a=第二个。
再然后我就一想,这函数中那个返回值的规则不是也要换了么:
可是原本一个本意实现升序的,结果在浏览器中执行结果是降序的。(当然火狐也是一样降序的)
困扰了我很久,然后我输出a,b的值,去试了好几个浏览器,终于在火狐浏览器发现端倪:
在火狐会输出:a = 5; b = 4;
在谷歌/ie/edge:a = 4; b = 5;
我逐渐意识到也许我们在进行这个sort排序方法时,我们自身不需要去考虑数组元素赋值时,到底把第一个元素赋值给a,还是b。
搜了很多人的博客,发现几年前的谷歌调试代码,上面ab输出也是a = 5; b = 4;
只不过它后续更新升级,然后就改变成现在这样了a=4 b=5
但是无论火狐还是谷歌,他们最终实现的排序效果都是一样的,都是升序或都是降序
故此,得出一个结论,我们不需要去关注a,b(到底前面的传递给a,还是后面的传递给a)
我们需要记住的就是:
a在前,b在后,然后a<b时,不换位置,return -1;(我们需要升序的时候)
a>b时,换位置,return 1;(我们需要升序的时候)
a=b时,不换位置,return 0;
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
需要降序的时候,return 1 和 return -1换个位置就行了
最终进阶:直接就升序:return a-b;
(升序,如果a<b,返回值小于0,是我们想要的,不换位置;如果a>b,大于0,不是我们想要的,所以换位置)
同理,降序:return b-a;
九亿少女脚臭
pp7***74714@gmail.com
闻丝卡达
114***4761@qq.com
在默认情况下, sort() 方法按升序排列数组项——即最小的值位于最前面,最大的值排在最后面。为了实现排序, sort() 方法会调用每个数组项的 toString() 转型方法,然后比较得到的字符串,以确定如何排序。即使数组中的每一项都是数值, sort() 方法比较的也是字符串,如下所示:
可见,即使例子中值的顺序没有问题,但 sort() 方法也会根据测试字符串的结果改变原来的顺序。因为数值 5 虽然小于 10,但在进行字符串比较时, "10" 则位于 "5" 的前面,于是数组的顺序就被修改了。不用说,这种排序方式在很多情况下都不是最佳方案。因此 sort() 方法可以接收一个比较函数作为参数,以便我们指定哪个值位于哪个值的前面。
比较函数接收两个参数,如果第一个参数应该位于第二个之前则返回一个负数,如果两个参数相等则返回 0,如果第一个参数应该位于第二个之后则返回一个正数。以下就是一个简单的比较函数:
这个比较函数可以适用于大多数数据类型,只要将其作为参数传递给 sort() 方法即可,如下面这个例子所示。
在将比较函数传递到 sort() 方法之后,数值仍然保持了正确的升序。当然,也可以通过比较函数产生降序排序的结果,只要交换比较函数返回的值即可。
闻丝卡达
114***4761@qq.com
Casey
lil***jian@sina.com
上面的解释都棒, 这里补充一个对象数组的排序, 方便大家理解:
Casey
lil***jian@sina.com