简介
在以往的 JavaScript 数组排序中,对于相同值的排序规则不太明确,往往只有默认的字母表顺序。这导致了一些对于数字和其他类型的排序会出现较大的问题。在 ECMAScript 2019 中,Array.sort 方法新增了明确的排序规则,并加入了一系列新的特性,使得排序更加可控和可预测。
新增的排序规则
ECMAScript 2019 引入了 Intl.Collator,它可以帮助我们实现更加明确的排序规则。通过指定排序的字符串的语言和选项,我们可以获得更加符合期望的结果。具体来说,可以通过下面的代码创建一个排序器实例:
const collator = new Intl.Collator('zh-CN', { numeric: true, sensitivity: 'base' });
其中,'zh-CN' 表示使用中文排序规则,numeric 表示要对数字进行排序,而 sensitivity: 'base' 告诉排序器不考虑大小写和重音。
现在我们就可以使用它来排序数组了:
const arr = ['a', 'b', '10', '1']; arr.sort(collator.compare); console.log(arr); // ['1', '10', 'a', 'b']
新增的特性
除了更加明确的排序规则,ECMAScript 2019 也为 Array.sort 引入了一些新的特性,使得我们可以更加方便地进行排它操作。
可选的 compareFunction 返回值
在以往版本的 ECMAScript 中,我们必须返回 -1、0 或 1 这三个值作为 compareFunction 的返回值。不过在 ECMAScript 2019 中,我们可以返回任意值,这样可以让我们更好地反映出排序的实际结果。
const arr = ['a', 'b', '10', '1']; const result = arr.sort((a, b) => a - b); console.log(result); // ['1', '10', 'a', 'b']
稳定排序
稳定排序是指相同值在排序后依然保持原来的顺序。在 ECMAScript 2019 中,我们可以使用 Array.prototype.stableSort 方法进行稳定排序。
Array.prototype.stableSort = function(compareFunction) { const original = this.slice(0); this.sort(function (a, b) { const result = compareFunction(a, b); return result === 0 ? original.indexOf(a) - original.indexOf(b) : result; }); };
使用稳定排序的例子:
const arr = [{ id: 2 }, { id: 1 }, { id: 2 }, { id: 3 }]; arr.stableSort((a, b) => a.id - b.id); console.log(arr); // [{ id: 1 }, { id: 2 }, { id: 2 }, { id: 3 }]
总结
ECMAScript 2019 引入的 Array.sort 新特性解决了以往对于相同值排序不明确的问题,更加方便了我们进行排序操作。通过明确的排序规则,我们可以更加准确地描述排序的期望结果,而新增的稳定排序特性则可帮助我们保持原有的排序顺序。这些特性和新增规则让我们在实际开发时更加得心应手,避免了因排序错误带来的不便和困扰。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6518b6da95b1f8cacd105792