定义
sort()方法用于在原数组的基础上对数组的元素进行排序,并返回排序后的数组,不会创建新数组。
语法
arrayObject.sort(sortby)
参数sortby :可选。用来规定排序的顺序,如有必须是函数。
用法
如果调用该方法时没有使用参数,默认排序顺序是根据字符串UniCode码进行升序排序。
let arr1 = new Array(6)
arr1[0] = 'hello'
arr1[1] = 'my'
arr1[2] = 'name'
arr1[3] = 'a'
arr1[4] = 'z'
arr1[5] = 'b'
console.log(arr1+'\n')
console.log(arr1.sort())
如果元素不是字符串,则 sort() 方法会把数组元素都转换成字符串,逐位比较字符串元素值,而不是根据字符串中的字符个数进行排序。
let arr = [12,9,30,220,48,21]
arr.sort()
console.log(arr)
在任何情况下,数组中 undefined 的元素都被排序在末尾。
如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。
比较函数必须具有两个参数 a 和 b,其返回值规则如下:
- 当返回值为负数,第一个参数a所对应的数组元素要排在第二个参数b所对应的数组元素的前面
- 当返回值为正数,第二个参数b所对应的数组元素要排在第一个参数a所对应的数组元素的前面
- 当返回值为0,顺序不变
比较函数中参数a,b的传参顺序:(类似冒泡排序)(arr[0],arr[1]) -> (arr[0],arr[2]) -> ... -> (arr[0],arr[arr.length-1]) -> (arr[1],arr[2]) -> ...-> (arr[1],arr[arr.length-1]) -> (arr[2],arr[3]) -> ... -> (arr[arr.length-2]),arr[arr.length-1]
例:
var arr = [20,2,10,13,4,8,9]
arr.sort(function(a,b){//升序
if(a > b){
return 1;
}else{
return -1;
}
})
升序排序过程:(类似冒泡排序)
a=20 <arr[0]> ,b=2 <arr[1]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,20,10,13,4,8,9]
a=2 <arr[0]>,b=10 <arr[2]>,a<b,return -1,a要放在b前面,相当于位置不变->[2,20,10,13,4,8,9]
a=2 <arr[0]>,b=13 <arr[3]>,a<b,retutn -1,a要放在b前面,相当于位置不变->[2,20,10,13,4,8,9]
…
a=20 <arr[1]>,b=10 <arr[2]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,10,20,13,4,8,9]
a=10 <arr[1]>,b=13 <arr[3]>,a<b,retutn -1,a要放在b前面,相当于位置不变->[2,10,20,13,4,8,9]
a=10 <arr[1]>,b=4 <arr[4]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,4,20,13,10,8,9]
…
a=20 <arr[2]>,b=13 <arr[3]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,4,13,20,10,8,9]
a=13 <arr[2]>,b=10 <arr[4]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,4,10,20,13,8,9]
a=10 <arr[2]>,b=8 <arr[5]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,4,8,20,13,10,9]
…
a=20 <arr[3]>,b=13 <arr[4]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,4,8,13,20,10,9]
a=13 <arr[3]>,b=10 <arr[5]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,4,8,10,20,13,9]
a=10 <arr[3]>,b=9 <arr[6]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,4,8,9,20,13,10]
a=20 <arr[4]>,b=13 <arr[5]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,4,8,9,13,20,10]
a=13 <arr[4]>,b=10 <arr[6]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,4,8,9,10,20,13]
a=20 <arr[5]>,b=13 <arr[6]>,a>b,return 1,b要放在a前面,即a和b调换位置->[2,4,8,9,10,13,20]
升序排序完成
该 升序排序的比较函数可以简化为
function(a,b){//升序
return a-b
}
同理可知 降序排序的比较函数为
function(a,b){//降序
return b-a
}
实例
例1:
升序排序
let arr = [12,9,30,220,48,21]
console.log(arr+'\n')
console.log(arr.sort(function(a,b){
return a - b;
}))
例2:
降序排序
let arr = [12,9,30,220,48,21]
console.log(arr+'\n')
console.log(arr.sort(function(a,b){
return b - a;
}))
例3:
对数组中对象的某一属性进行排序
let arr = [{name:'xx',age:12},
{name:'kk',age:34},
{name:'ii',age:3}]
function compare(prop){
return function(a,b){
let value1 = a[prop];
let value2 = b[prop];
return value1 - value2;
}
}
console.log(arr.sort(compare('age')))
或
let arr = [{name:'xx',age:12},
{name:'kk',age:34},
{name:'ii',age:3}]
console.log(arr.sort(function(a,b){
return a['age']-b['age']
}
))
例4:
实现一个有序的数组的乱序,每次乱序都不相同
数组元素的排序规则取决于比较函数的返回值,只要让返回值在正数和负数之间随机取值,就能实现数组乱序
let arr = [1,2,3,4,5,6,7]
console.log(arr.sort(function(a,b){
return Math.random()-0.5;//Math.random()方法在(0,1)开区间随机取值
}))
例5:
按元素的字符串长度和字节长度分别给数组排序
字符串长度排序:
let arr = ['abc','dfadfa','2','oooo','aihflahfalo','tt']
console.log(arr.sort(function(a,b){
return a.length-b.length
}))
字节长度排序:
function retBytes(str){//计算字符串字节长度
var num = str.length;
for(var i = 0;i < str.length;i++){
if(str.charCodeAt(i)>255){//charCodeA
num++;
}
return num;
}
}
let arr = ['abl啦啦啦c','df大大小小fa','2','o殷志源oo','aihflahf吃饭lo','t哈t']
console.log(arr.sort(function(a,b){
return retBytes(a)-retBytes(b)
}))
注
charCodeAt(位置下标)
和charAt(位置下标)
charCodeAt()方法是返回字符串中指定位置字符的unicode码
charAt()方法是返回字符串你中指定位置的字符