重排序sort()的用法,从简单了解到深入概念
- 简单的重排序方法–反排序
我们知道,可以直接作为数组重排序的有两种方法:reverse()和sort()。
在使用的reverse()方法是,得到的是数组的反排序,下面举一个例子:
var arr = [10,5,100,1,26,80];
document.write(arr.reverse());
得出的效果是这样子的:
不难理解reverse有以下意思:
vt. (使) 反转; (使) 颠倒; //反转==反排序
在这个随手敲入的数组中,经过reverse()之后,数组从原来的数组最后一个往前排序。当然无论数组由数字或者字符、字符串组成,还是三者混搭形式,其排序方式只与其所在的位置有关,即数组索引。
这个方法得作用就相当的直观了,但是用起来不够灵活,因为,毕竟对于按照数字大小的顺序排序,自然地reverse()就用不上了。
直入sort()学习
要使数组灵活应对,那么sort()就能够发挥作用。
首先尝试向数组中敲入字符或字符串类型的数据,如以下代码:
var arr = ["add","a","easy","change","port","party"];
document.write(arr.sort());
所显示的效果是这样的:
这样的排序就像是牛津字典上的排序一样,从每个单词的首字母开始比较,排在字典上是比较前的就是在前面。也就是按照a~z的顺序重排序。
但是注意一个小问题,当将其字母改为大写,如下代码:
var arr = ["add","a","Easy","change","port","party"];
document.write(arr.sort());
呈现的效果却是这样的:
神奇的是,E开头的字符串跑到了a的前面。
当然以上的解析只是供给大家快速得出排序,而真正的含义则是:
按照字符串中的每个字符依次按照ASCII表的大小来排序。E(69)的ASCII值小于a(97)的ASCII值,因此排在了前面。如果第一个字符的ASCII值比第二个字符的ASCII值要小,那么第一个字符所在的位置的元素就排在第二个字符所在的位置的元素的前面;如果两个字符串中前一个或前几个都相同,那么直到出现不同为止;如果两个字符串前一个或前几个都相同,一个还有字符,一个没有或者有,那么短的字符串在前。
对应的数字也是这样。
对于以下的代码:
var arr = [10,5,100,1,26,80];
document.write(arr.sort());
对应的结果是这样的:
很显然,这样的重排序也是按照ASCII表来排序的。虽然数值5比10小,但是在进行字符串比较时,“10”则位于“5”的前面,因为因为第一个字符1(01)和字符5(05)中1在5的前面。
- 实现大小重排序:
以上的方法中,只是实现了简单的重排序方法,而没有在数值上的对比功能,增加以下代码:
1、
function Number(a,b){
return b-a;
}
var arr = [10,5,100,1,26,80];
document.write(arr.sort(Number));
2、
function Number(a,b){
return a<b;
}
3、
function Number(a,b){
if (b < a){
return -1;
} else if (b > a){
return 1;
} else {
return 0;
}
}
此时第一个代码块中return b-a向sort传入一个正数,三个代码块都可实现从大到小排序,实现降序。
相反的。升序。(只需将a和b调换顺序或更换返回值即可)
1、
function Number(a,b){
return a-b;
}
var arr = [10,5,100,1,26,80];
document.write(arr.sort(Number));
2、
function Number(a,b){
return b<a;
}
3、
function Number(a,b){
if (b < a){
return 1;
} else if (b > a){
return -1;
} else {
return 0;
}
}
说明
如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下:
若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。
若 a 等于 b,则返回 0。
若 a 大于 b,则返回一个大于 0 的值。
注意:
- 对数组的引用。请注意,数组在原数组上进行排序,不生成副本!
- sort()内填必须是函数名且不带任何参数!