前言
在前端开发中,Array.prototype.sort() 方法是一个非常常用的数组排序方法。虽然我们在日常使用中经常会用到它,但是它的高级用法却很少被人所熟知。在 ECMAScript 2021 中,Array.prototype.sort() 方法进行了一些更新,本文将详细介绍这个方法的用法以及更新内容。
基础用法
Array.prototype.sort() 方法是用来对数组进行排序的。它可以接受一个可选的参数,即一个比较函数。如果不传入比较函数,那么数组会按照 Unicode 编码进行排序。
以下是一个简单的排序示例:
const arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]; arr.sort(); console.log(arr); // [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
在上面的例子中,我们并没有传入比较函数,因此数组按照 Unicode 编码进行了排序。
比较函数
我们可以通过传入一个比较函数来自定义排序规则。比较函数应该接受两个参数,分别是要比较的两个元素。
比较函数应该返回一个数字,表示两个元素之间的大小关系。如果返回一个小于 0 的数字,那么第一个参数会排在第二个参数的前面;如果返回一个大于 0 的数字,那么第一个参数会排在第二个参数的后面;如果返回 0,那么两个元素的顺序不会发生改变。
以下是一个使用比较函数的示例:
const arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]; arr.sort((a, b) => a - b); console.log(arr); // [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
在上面的例子中,我们传入了一个比较函数 (a, b) => a - b
,它会按照数字大小进行排序。
更新内容
在 ECMAScript 2021 中,Array.prototype.sort() 方法进行了一些更新,主要是增加了一些可选的参数,使得排序更加灵活。
可选参数:stable
在 ECMAScript 5 之前,Array.prototype.sort() 方法并不保证排序的稳定性。所谓稳定性,就是指如果两个元素的大小相等,那么它们在排序后的相对位置不会发生改变。
在 ECMAScript 5 中,Array.prototype.sort() 方法保证了排序的稳定性。但是在 ECMAScript 2021 中,你可以通过传入 stable: false
来关闭排序的稳定性。这样做可以提高排序的性能,但是也会使得排序变得不稳定。
以下是一个关闭稳定性的示例:
const arr = [ { name: 'Alice', age: 25 }, { name: 'Bob', age: 20 }, { name: 'Charlie', age: 25 }, ]; arr.sort((a, b) => a.age - b.age, { stable: false }); console.log(arr); // [{ name: 'Bob', age: 20 }, { name: 'Alice', age: 25 }, { name: 'Charlie', age: 25 }]
在上面的例子中,我们传入了一个比较函数 (a, b) => a.age - b.age
,并且关闭了排序的稳定性。这样做会提高排序的性能,但是会使得相同年龄的人的顺序发生改变。
可选参数:introduceUndefinable
在 ECMAScript 2021 中,你可以通过传入 introduceUndefinable: true
来允许排序数组中包含 undefined 值。这样做可以提高排序的灵活性,但是也会使得排序变得更加复杂。
以下是一个允许 undefined 值的示例:
const arr = [3, 1, undefined, 4, 1, 5, 9, 2, 6, 5, 3, 5]; arr.sort((a, b) => a - b, { introduceUndefinable: true }); console.log(arr); // [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9, undefined]
在上面的例子中,我们传入了一个比较函数 (a, b) => a - b
,并且允许数组中包含 undefined 值。这样做会使得排序更加灵活,但是会使得排序变得更加复杂。
高级用法
除了上面介绍的基础用法和更新内容之外,Array.prototype.sort() 方法还有一些高级用法,可以帮助我们更好地使用它。
排序对象数组
在实际开发中,我们经常需要对对象数组进行排序。这时候就需要传入一个比较函数,来决定按照哪个属性进行排序。
以下是一个排序对象数组的示例:
const arr = [ { name: 'Alice', age: 25 }, { name: 'Bob', age: 20 }, { name: 'Charlie', age: 30 }, ]; arr.sort((a, b) => a.age - b.age); console.log(arr); // [{ name: 'Bob', age: 20 }, { name: 'Alice', age: 25 }, { name: 'Charlie', age: 30 }]
在上面的例子中,我们传入了一个比较函数 (a, b) => a.age - b.age
,它会按照年龄进行排序。
排序字符串数组
在排序字符串数组时,我们可以使用 String.prototype.localeCompare() 方法来进行比较。这个方法会根据当前的语言环境来确定排序规则。
以下是一个排序字符串数组的示例:
const arr = ['a', 'B', 'c', 'D', 'e']; arr.sort((a, b) => a.localeCompare(b)); console.log(arr); // ['a', 'B', 'c', 'D', 'e']
在上面的例子中,我们使用了 String.prototype.localeCompare() 方法来进行比较。
排序数字数组
在排序数字数组时,我们可以使用 sort() 方法的基础用法来进行比较。
以下是一个排序数字数组的示例:
const arr = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]; arr.sort((a, b) => a - b); console.log(arr); // [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
在上面的例子中,我们使用了 sort() 方法的基础用法来进行比较。
总结
Array.prototype.sort() 方法是一个非常常用的数组排序方法。在 ECMAScript 2021 中,它进行了一些更新,使得排序更加灵活。除了基础用法之外,它还有一些高级用法,可以帮助我们更好地使用它。在实际开发中,我们应该充分了解它的用法,以便更好地使用它。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65dd79371886fbafa4ad38ab