将数组按 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
}