入职N天的我,终于接到了我的第一个需求
我是9月份中下旬入职的,入职了之后,每天的工作就是熟悉代码和框架,就这样过了几天之后,迎来了我在新公司的第一个节日:国庆节。
每年国庆节都是农民最开心的日子,因为要秋收了,秋收就意味着赚钱了,但是今年农作物的行情就跟程序员的行情一样,超级不好,各种粮食的价格都很便宜,辛辛苦苦一年只能算个收支平衡(来自一个农二代的吐槽)。
节后第一天,由于领导请假了,所以我还是在自己看代码(是的,还在看)。等到了第二天,领导来上班了,我迫不及待的问领导有没有什么需求给我,领导说快有了,然后我就只能默默地等待,好在中午快吃饭的时候,领导跟我说有个功能需要修改一下,让我来做(激动地心,颤抖的手,终于有需求可做了)
项目排序功能
需求:根据汉字拼音进行排序。
有以下几种实现方案
方式一:通过String.prototype.localCompare()
const arr = ['我十分', '喜欢', '写', '代码'];
function sortArr(data) {
return data.sort((a, b) => a.localeCompare(b, 'zh', { sensitivity: 'base' }))
}
sortArr(arr)
如果大家有对localeCompare不熟悉的可以继续往下看,如果有比较熟悉的,那么可以直接跳过。
localeCompare
返回一个数字,用于表示引用字符串(调用者referenceString)在比较字符串(第一个参数compareString)的前面、后面、或者相等
参数
- compareString: 要与referenceString进行比较的字符串,所有值都会被强制转换为字符串。如果不传或者传入undefined会出现你不想要的情况
- locals:表示语言类型,比如zh就是中文
- options: 一堆属性
- localeMather:区域匹配算法
- usage:比较是用于排序还是用于搜索匹配的字符串,支持sort和search,默认sort
- sensitivity:字符串哪些差异导致非0
- base:字母不同的字符串比较不相等,a≠b,a=A
- accent:字母不同 || 重音符号和其他变音符号的不同字符串比较不相等, a ≠ b、a ≠ á、a = A。
- case:字母不同 或者 大小写的字母表示不同 a ≠ b,a ≠ A
- variant:字符串的字母、重音和其他变音符号,或者不同大小写比较不相等,a ≠ b、a ≠ á、a ≠ A
注意:当useage的字为sort时,sensitivity的字默认为variantignore
- Punctuation:是否忽略标点符号,默认为falsen
- umeric:是否使用数字对照,使得“1”<“2”<“10”,默认是false
- caseFirst:是否个根据大小写排序,可能的值是upper、lower、false(默认设置)
- collation:区域的变体
- pinyin:汉语
- compat:阿拉伯语
locals中的配置会和options内的配置会发生重叠,如果有重叠,options的优先级更高
注意:某些浏览器中可能不支持locals或者options,那么此时会忽略这些属性
返回值
返回一个数字
- 如果引用字符串在比较字符串前面,返回负数
- 如果引用字符串在比较字符串后面,返回正数
- 如果两者相同,那么返回0
warning:不要依赖具体的返回值去做一些事情,因为在不同的浏览器、或者相同浏览器的不同版本中,返回的具体数值可能是不一样的,W3C只要求返回值是正数或者负数,而不规定具体的值。
方式2:通过pinyin库
- 需要安装
pinyin
库,在命令行中执行
npm install pinyin
- 实现排序逻辑
const { pinyin } = require('pinyin')
const arr = [ '我十分', '喜欢', '写', '代码' ]
const sortedWords = arr.sort((a, b) => {
const pinyinA = pinyin(a, { style: pinyin.STYLE_NORMAL }).flat().join('')
const pinyinB = pinyin(b, { style: pinyin.STYLE_NORMAL }).flat().join('')
return pinyinA.localeCompare(pinyinB)
})
console.log(sortedWords)
方式3:自己实现一套映射
因为我们的文案不是确定的,且可以随意修改,所以这种方案不提倡,但是如果只有几个固定的文案,这样可以自己实现一套映射
const pinyinMap = {
我十分: 'woshifen',
喜欢: 'xihuan',
写: 'xie',
代码: 'daima',
}
const arr = [ '我十分', '喜欢', '写', '代码' ]
const sortedWords = arr.sort((a, b) => pinyinMap[a].localeCompare(pinyinMap[b]))
console.log(sortedWords)
上面三种方式,可以看的出来,第一种还是存在一定的误差,但是我还是选择了第一种实现方式,有以下几个原因
- 不需要额外的引入库
- 我们的文案是随时可以修改的
- 我们对于排序的要求没有那么强烈,只要排一个大致的顺序即可
以上就是我对根据汉字拼音排序实现方案的理解,欢迎大家补充,希望大家一起进步!
来源:juejin.cn/post/7423573726400299027