数组 sort( ) 方法

本文详细介绍了JavaScript中数组sort()方法的工作原理及使用方法。解释了如何通过自定义比较函数来实现不同类型的排序,包括数字排序和对象属性排序。同时提供了使用map辅助排序的技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sort() 方法用原地算法对数组进行 原位(in-place) 排序,更改元素的顺序,并返回数组。默认排序顺序是在将元素转换为字符串,然后比较它们的UTF-16代码单元值序列时构建的

语法

arr.sort([compareFunction])

      参数 :

compareFunction 可选

用来指定按某种顺序进行排列的函数。如果省略,元素按照转换为的字符串的各个字符的Unicode位点进行排序。

first

第一个用于比较的元素。

second

第二个用于比较的元素。

     返回值:

返回排序后的数组,但是返回值通常会被忽略,因为修改了 arr 本身。请注意,数组已原地排序,并且不进行复制。

理解

如果没有指明 compareFunction ,那么元素会按照转换为的字符串的诸个字符的Unicode位点进行排序。例如 "Banana" 会被排列到 "cherry" 之前。当数字按由小到大排序时,9 出现在 80 之前,但因为(没有指明 compareFunction),比较的数字会先被转换为字符串,所以在Unicode顺序上 "80" 要比 "9" 要靠前。

let arr = [ 1, 9, 80 ];

// 该方法重新排列 arr 的内容
arr.sort();

alert( arr );  // 1, 80, 9

如果指明了 compareFunction ,那么数组会按照调用该函数的返回值排序。即 a 和 b 是两个将要被比较的元素: 

  • 如果 compareFunction(a, b) 小于 0 ,那么 a 会被排列到 b 之前;
  • 如果 compareFunction(a, b) 等于 0 , a 和 b 的相对位置不变。备注: ECMAScript 标准并不保证这一行为,而且也不是所有浏览器都会遵守(例如 Mozilla 在 2003 年之前的版本);
  • 如果 compareFunction(a, b) 大于 0 , b 会被排列到 a 之前。
  • compareFunction(a, b) 必须总是对相同的输入返回相同的比较结果,否则排序的结果将是不确定的。

 

function compare(a, b) {
  if (a > b) return 1; // 如果第一个值比第二个值大
  if (a == b) return 0; // 如果两个值相等
  if (a < b) return -1; // 如果第一个值比第二个值小
}

arr可能包含数字、字符串、对象或其他任何内容。我们有一组 一些元素。要对其进行排序,我们需要一个 排序函数 来确认如何比较这些元素。默认是按字符串进行排序的。

要比较数字而非字符串,比较函数可以简单的以 a 减 b,如下的函数将会将数组升序排列

let arr = [ 1, 2, 15 ];

arr.sort(function(a, b) { return a - b; });

alert(arr);  // 1, 2, 15


//箭头函数更加简洁
arr.sort( (a, b) => a - b );

 对象可以按照某个属性排序:

let list = [
  {
    id : 9,
    price : 10 ,
    name : '苹果'

  },
  {
    id : 21,
    price : 3.6 ,
    name : '柚子'

  },
  {
    id : 44,
    price : 40,
    name : '榴莲'

  }
]

list.sort((obj1,obj2) => obj1.price-obj2.price )

console.log(list) 

//得到结果如下图

 

 使用映射对字符串排序:

compareFunction 可能需要对元素做多次映射以实现排序,尤其当 compareFunction 较为复杂,且元素较多的时候,某些 compareFunction 可能会导致很高的负载。使用 map 辅助排序将会是一个好主意。基本思想是首先将数组中的每个元素比较的实际值取出来,排序后再将数组恢复。

// 需要被排序的数组
let list = ['Delta', 'alpha', 'CHARLIE', 'bravo'];

// 对需要排序的数字和位置的临时存储
let newList = list.map(function(el, i) {
  return { index: i, value: el.toLowerCase() };
})

// 按照多个值排序数组
newList.sort(function(a, b) {
  return +(a.value > b.value) || +(a.value === b.value) - 1;
});

// 根据索引得到排序的结果
let result = newList.map(function(el){
  return list[el.index];
});

console.log(result)

//结果如下图

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值