javascript - 如何获得一致的数字排序结果?
问题描述
数字排序在不同的浏览器中给了我不同的值:
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);
得到相同的结果。
解决方案
您可以像这样更改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
推荐阅读
- javascript - Jquery获取客户端宽度的DOM值
- pytorch - 为什么使用 GPT2Tokenizer 将阿拉伯字符转换为符号?
- c++ - 调用 GLEW 函数时进程以退出代码 -1073741515 完成
- android - 使用 Post API 尝试 Retrofit2,响应显示成功但返回垃圾值
- c# - c# 按索引对列表进行分组
- django - 获取上传文件的Django模型名称
- c++ - cin.fail() 和 !(cin>>var) 在输入多个整数然后是字符串或字符时失败
- c# - 将十六进制转换为 unicode
- javascript - 在 ReactJs 中制作计时器/倒计时代码时遇到问题
- node.js - 在nodejs中以windows-1251编码格式下载文件