首页 > 解决方案 > 如何获得一致的数字排序结果?

问题描述

数字排序在不同的浏览器中给了我不同的值:

function compareNumbers(a, b) {
    return a - b;
}

['B', 'C', 'A'].sort(compareNumbers);

Chrome 和 Safari 没有改变顺序,但在 Firefox 中我得到了

['A', 'C', 'B']

如何在浏览器中获得一致的排序?

我实际上想要实现的是按数字和字典顺序对数组进行排序。例如,在 Chrome 和 Safari 中,

[5, 11, 'B', 'C', 8, 'A'].sort().sort(compareNumbers);

似乎完成了任务,即

[5, 8, 11, 'A', 'B', 'C']

在 Firefox 中我必须做

[5, 11, 'B', 'C', 8, 'A'].sort().reverse().sort(compareNumbers);

得到相同的结果。

标签: javascriptarraysgoogle-chromesortingfirefox

解决方案


您可以像这样更改comapreFuncion:

const arr = [5, 11, 'B', 'C', 8, 'A']
arr.sort((a, b) => a - b || a.toString().localeCompare(b.toString()))
console.log(arr)

如果要比较的两个项目都是数字,则减法将决定顺序。如果其中一个是字母表,a-b将返回NaN哪个falsy值。然后,||将检查第二个条件,它们将使用按字母顺序排序localeCompare


推荐阅读