介绍
在ES10(即ES2019)中,新增了一个稳定排序(stable-sort)的特性,这个特性主要是为了解决在某些情况下,标准的排序算法会改变数组元素的原始顺序的问题。在一个前端项目中,我们可能会遇到比如排序后的列表展示、搜索等功能,这些都依赖于一个可靠的、不改变数组原始顺序的算法。
使用
ES10提供了一个全局函数Array.prototype.stableSort()
,我们可以使用这个函数来进行稳定排序。
该函数接受一个可选参数,指定排序比较函数。比较函数和标准的sort方法中的函数参数格式一致,它需要返回一个数字,表示相对位置关系。具体来说,如果参数大于0,那么第二个元素会在第一个元素之前,在排序后的数组中。如果小于0,则反之。如果相等,则它们的相对位置不变。
对于一般的数值、布尔、字符串类型的元素,比较函数可以用标准的方式进行排序。例如:
const arr1 = [1, 3, 5, 8, 10, 6, 3] arr1.stableSort() // 输出:[1, 3, 3, 5, 6, 8, 10]
如果数组里的每个元素都是一个对象,那么我们可以自己定义一个比较函数。例如,假设我们有一个列表,里面包含了每个人的名字和年龄,我们希望按照年龄从小到大排序:
const arr2 = [{name: 'Alice', age: 21}, {name: 'Bob', age: 18}, {name: 'Charlie', age: 25}] arr2.stableSort((a, b) => a.age - b.age) // 输出:[{name: 'Bob', age: 18}, {name: 'Alice', age: 21}, {name: 'Charlie', age: 25}]
在这个例子中,我们传入了一个比较函数,这个函数用来比较每个元素的age属性。注意,我们需要返回age的差值,如果是正数,则表示a比b大;如果是负数,则表示a比b小。
进一步思考
值得注意的是,Array.prototype.sort()方法没有保证排序的稳定性。也就是说,当有多个元素有相同的排序值时,sort方法并不保证它们在排序后的数组中保持原来的相对位置。这个问题或许不像我们在前端项目中使用的排序一样重要,但是在一些更严谨的算法问题中,确实是需要这个特性的。
结论
在我们的日常开发中,也许没有人会真的关心排序算法是否稳定。但是,当你需要保留一些元素在排序过后的相对位置关系时,稳定排序是不可或缺的。对于稳定排序的实现,ES10带来了一个全新的、更加可靠的选择。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/672037562e7021665e013589