将数组按 a-z 排序
- /**
- * 将数组按 a-z 排序
- * 返回格式 { segs:[{ initial: 'a-z', data: [原数据 1, 原数据 2...] }] }
- * 参数格式 [{titleName: 'xxx'}]
- */
- export function azSort(arr) {
- if (arr.length === 0) return
- if (!String.prototype.localeCompare) return null
- var letters = '*ABCDEFGHJKLMNOPQRSTWXYZ'.split('')
- var zh = '阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀'.split('')
- var segs = [] // 存放数据
- var res = {}
- let curr
- var re = /[^\u4e00-\u9fa5]/// 中文正则
- var pattern = new RegExp('[`\\-~!@#$^&*()=|{}\':;\',\\[\\].<>《》/?~!@#¥……&*()——|{}【】‘;:”“\'。,、?12345678990]') // 特殊符号
-
- letters.filter((items, i) => {
- curr = {
- initial: '', // 字母
- data: [] // 数据
- }
- arr.map((v, index) => {
- // 特殊字符
- if (pattern.test(v.titleName[0])) {
- if ((!zh[i - 1] || zh[i - 1].localeCompare(v.titleName) <= 0) && v.titleName.localeCompare(zh[i]) === -1) {
- curr.data.push(v)
- }
- }
- // 判断首个字是否是中文
- if (re.test(v.titleName[0])) {
- // 英文
- if (v.titleName[0].toUpperCase() === items) {
- curr.data.push(v)
- }
- } else {
- // 中文
- if ((!zh[i - 1] || zh[i - 1].localeCompare(v.titleName) <= 0) && v.titleName.localeCompare(zh[i]) === -1) {
- curr.data.push(v)
- }
- }
- })
- if (curr.data.length) {
- curr.initial = letters[i]
- segs.push(curr)
- curr.data.sort((a, b) => {
- return a.titleName.localeCompare(b.titleName)
- })
- }
- })
- res.segs = Array.from(new Set(segs)) // 去重
- return res
- }