JS sort()数组排序方法

定义

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
}

注意,sort()不等价于sort((a, b) => a - b)

1.默认排序行为

  • sort() 默认情况下会按照数组元素的 Unicode 编码顺序进行排序。对于数字类型的元素,它们会先被转换为字符串再进行比较。
  • sort((a, b) => a - b) 传入了一个比较函数,它会根据数字的大小进行排序。

2.对不同数据类型的处理

  • sort() 当数组包含不同类型的元素时,sort() 会先将它们转换为字符串再进行比较,可能会得到意料之外的结果。
  • sort((a, b) => a - b) 该比较函数只适用于数字类型的元素,如果数组包含其他类型的元素,需要使用更复杂的比较逻辑。

实例

例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()方法是返回字符串你中指定位置的字符

  • 21
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值