关于“深入理解js数组的sort排序”,我可以提供以下攻略:
一、sort排序的基本用法
sort
是JavaScript中数组的一种方法,用于给数组排序。基本用法如下:
array.sort(compareFunction)
其中,array
是需要排序的数组,compareFunction
是比较函数,可以是可选的。如果指定了比较函数,它将决定排序的顺序。如果未指定比较函数,则按字母顺序对元素进行排序:
const fruits = ['apple', 'banana', 'orange', 'lemon']
fruits.sort()
console.log(fruits) // ['apple', 'banana', 'lemon', 'orange']
可以看到,由于没有指定比较函数,sort
方法按字母顺序对元素进行排序。
如果要按数字大小对元素排序,比较函数可以这样写:
const numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
numbers.sort((a, b) => {
return a - b
})
console.log(numbers) // [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
这里指定了一个比较函数,使用箭头函数的形式。比较函数中返回的是a - b
,这是一个简单的比较方式,如果它的结果是正数,则a
排在b
后面,如果结果是负数,则a
排在b
前面,如果结果是0,则顺序不变。
二、完整的sort排序过程
1.排序算法
sort
方法使用的是一种叫做快速排序的算法。快速排序的过程可以分为三个步骤:分割、排序和合并。
分割:将数组分成两个子数组,分割的位置取决于选择的枢轴值(pivot value)。枢轴值可以是数组中的任意元素,但最好选择中间位置的元素。
排序:对分割得到的两个子数组进行排序。
合并:将排序后的子数组合并成一个有序的数组。
2.比较函数
如果指定了比较函数,它将决定排序的顺序。比较函数有以下规定:
- 如果比较函数的返回值为负数,表示第一个元素在排序后应该排在第二个元素的前面;
- 如果返回值为0,表示两个元素相等,顺序不变;
- 如果返回值为正数,表示第二个元素在排序后应该排在第一个元素的前面。
3.具体实现
当对一个数组进行排序时,sort
会按照以下步骤进行操作:
- 如果数组只包含一个元素或为空,返回该数组;
- 选择一个枢轴值;
- 将数组分割成两个子数组,比枢轴值小的元素放在左边,大的放在右边;
- 对子数组进行排序,使用递归的方式;
- 合并左右两个子数组,并将枢轴值放在中间。
这样就得到了一个排序后的数组。
三、示例说明
下面是针对数组里包含对象的情况的两个示例:
1.根据对象属性排序
假设有这样一个数组:
const people = [
{ name: 'mike', age: 25 },
{ name: 'jane', age: 29 },
{ name: 'john', age: 20 },
]
现在要按年龄大小对这个数组进行排序,可以使用比较函数:
people.sort((a, b) => {
return a.age - b.age
})
这个比较函数比较简单,直接比较对象的age
属性,按照年龄大小进行排序。
2.根据对象多个属性排序
如果要按照多个属性进行排序,则需要修改比较函数。假设有这样一个数组:
const people = [
{ name: 'mike', age: 25, score: 80 },
{ name: 'jane', age: 29, score: 90 },
{ name: 'john', age: 20, score: 75 },
{ name: 'sarah', age: 20, score: 85 },
]
现在要按照年龄和分数对这个数组进行排序,可以使用比较函数:
people.sort((a, b) => {
if (a.age === b.age) {
return b.score - a.score
}
return a.age - b.age
})
这个比较函数比较复杂,先比较对象的age
属性,如果相等,则比较score
属性,按照分数降序排序。如果age
属性不相等,则按照年龄升序排序。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:深入理解js数组的sort排序 - Python技术站