javascript - 通过将 a.localeCompare(b) 切换为 (a<b?-1 :(a>b? 1:0)),排序速度提高 400 倍

标签 javascript google-chrome sorting

通过切换 javascript 排序函数从

myArray.sort(function (a, b) {
  return a.name.localeCompare(b.name);
});

myArray.sort(function (a, b) {
  return (a.name < b.name ? -1 : (a.name > b.name ? 1 : 0));
});

我能够将在 Chrome 中对约 1700 个元素数组进行排序的时间从 1993 毫秒缩短到 5 毫秒。几乎是 400 倍的加速。不幸的是,这是以正确排序非英语字符串为代价的。

显然,当我尝试进行排序时,我的 UI 不能阻塞 2 秒。我能做些什么来避免 localeCompare 速度慢得可怕但仍保持对本地化字符串的支持吗?

最佳答案

通过声明 collator 可以获得很大的性能提升。对象并使用它的比较方法。例如:

const collator = new Intl.Collator('en', { numeric: true, sensitivity: 'base' });
arrayOfObjects.sort((a, b) => {
  return collator.compare(a.name, b.name);
});

注意:如果元素是 float 的,这将无法正常工作。请参阅此处的解释:Intl.Collator and natural sort with numeric option sorts incorrectly with decimal numbers

这是比较这 3 种方法的基准测试脚本:

const arr = [];
for (let i = 0; i < 2000; i++) {
  arr.push(`test-${Math.random()}`);
}

const arr1 = arr.slice();
const arr2 = arr.slice();
const arr3 = arr.slice();

console.time('#1 - localeCompare');
arr1.sort((a, b) => a.localeCompare(
  b,
  undefined, {
    numeric: true,
    sensitivity: 'base'
  }
));
console.timeEnd('#1 - localeCompare');

console.time('#2 - collator');
const collator = new Intl.Collator('en', {
  numeric: true,
  sensitivity: 'base'
});
arr2.sort((a, b) => collator.compare(a, b));
console.timeEnd('#2 - collator');

console.time('#3 - non-locale');
arr3.sort((a, b) => (a < b ? -1 : (a > b ? 1 : 0)));
console.timeEnd('#3 - non-locale');

关于javascript - 通过将 a.localeCompare(b) 切换为 (a<b?-1 :(a>b? 1:0)),排序速度提高 400 倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14677060/

相关文章:

javascript - canvas.toDataURL() 抛出安全异常,尽管图像是本地的

javascript - 即使存储时,extjs 网格也不会显示预期数据,并且网格对象中存在列

javascript 适用于除 IE 之外的所有浏览器

javascript - 如何使用AngularJS显示图像数据? (奇怪的回复格式)

javascript - tr 链接,里面有 php 代码

javascript - array.sort() 没有给出所需的结果

javascript - 滚动条上错误的输入自动完成位置(chrome)

javascript - Chrome 扩展 list V3 如何读取我的用户正在查看的网页的 HTML 和文本内容

sorting - Haskell 列表输出中缺少第一个元素

c++ - 使用 tiled_range 推力 sort_by_key - 不重新排序