注册
web

入职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库



  1. 需要安装pinyin库,在命令行中执行

npm install pinyin


  1. 实现排序逻辑


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)



上面三种方式,可以看的出来,第一种还是存在一定的误差,但是我还是选择了第一种实现方式,有以下几个原因



  1. 不需要额外的引入库
  2. 我们的文案是随时可以修改的
  3. 我们对于排序的要求没有那么强烈,只要排一个大致的顺序即可

以上就是我对根据汉字拼音排序实现方案的理解,欢迎大家补充,希望大家一起进步!


作者:落魄的开发
来源:juejin.cn/post/7423573726400299027

0 个评论

要回复文章请先登录注册