数组排序是前端开发中最基础也是最常见的操作之一。在 ECMAScript 2021 中,主要有 2 种排序方法:sort() 和 sortedIndex()。
sort() 方法
sort() 方法是在原数组上修改排序顺序的。该方法会将数组的元素按照 Unicode 码点进行排序。在排序之前,sort() 方法会调用数组元素的 toString() 方法,将其转换为字符串,再比较排序。因此,sort() 方法并不能很好地处理数值类型的排序,需要使用自定义排序函数。
使用 sort() 方法进行默认排序
sort() 方法的默认排序是按照 ASCII 码表的顺序进行排列,不过有时这并不是我们想要的。可以使用以下方法进行排序:
const arr = [8, 10, 3, 1, 9]; arr.sort(); console.log(arr); // [1, 10, 3, 8, 9]
我们可以看到输出结果并不是我们期望的,所以需要自定义排序函数。
使用 sort() 方法进行自定义排序
我们可以使用自定义排序函数来解决默认排序的问题。
// javascriptcn.com 代码示例 const arr = [8, 11, 3, 1, 9]; arr.sort((a, b) => { if (a < b) { return -1; } else if (a > b) { return 1; } else { return 0; } }); console.log(arr); // [1, 3, 8, 9, 11]
使用 sort() 方法进行复杂对象的排序
当需要对复杂对象进行排序时,我们需要给 sort() 方法传入一个比较函数。这个比较函数需要返回一个数字来表示两个元素的顺序关系。例如:
// javascriptcn.com 代码示例 const items = [ { name: 'Edward', value: 21 }, { name: 'Sharpe', value: 37 }, { name: 'And', value: 45 }, { name: 'The', value: -12 }, { name: 'Magnetic', value: 13 }, { name: 'Zeros', value: 37 } ]; // sort by value items.sort(function (a, b) { return a.value - b.value; }); // sort by name items.sort(function(a, b) { var nameA = a.name.toUpperCase(); // ignore upper and lowercase var nameB = b.name.toUpperCase(); // ignore upper and lowercase if (nameA < nameB) { return -1; } if (nameA > nameB) { return 1; } // names must be equal return 0; });
sortedIndex() 方法
sortedIndex() 方法返回给出的值在这个数组中应该被放置的位置的索引值。这个方法非常适合用于数组元素的插入或者排序。
const arr = [1, 3, 5, 7, 9]; const index = arr.sortedIndex(6); console.log(index); // 3
总结
在 ECMAScript 2021 中进行最佳的数组排序需要注意以下几点:
sort() 方法是按照 Unicode 码点进行排序的,而且其默认排序方式是按照 ASCII 码表的顺序进行排列。
为了进行自定义排序,需要传入一个比较函数。这个函数应该返回一个数字来比较两个元素的顺序关系。
当需要对复杂对象进行排序时,需要传入一个比较函数,并需要注意对象的属性值类型。
sortedIndex() 方法返回给出的值在这个数组中应该被放置的位置的索引值,非常适合用于数组元素的插入或排序。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653e0a517d4982a6eb79ff53