73 lines
1.8 KiB
JavaScript
73 lines
1.8 KiB
JavaScript
// #ifdef APP-PLUS
|
|
import pinyin from 'pinyin'
|
|
// #endif
|
|
|
|
export const friendGroupByPy = (
|
|
arr,
|
|
keys,
|
|
isLowerCase = true
|
|
) => {
|
|
const res = {}
|
|
const OTHER_TAG = '#'
|
|
|
|
const add = (k, v) => {
|
|
const _k = isLowerCase ? k.toLowerCase() : k.toUpperCase()
|
|
if (!res[_k]) {
|
|
res[_k] = [v]
|
|
} else {
|
|
res[_k].push(v)
|
|
}
|
|
}
|
|
|
|
arr.forEach((item) => {
|
|
const v =
|
|
item[keys.firstKey] ||
|
|
item[keys.secondKey || ''] ||
|
|
item[keys.thirdKey || '']
|
|
if (!!v && typeof v === 'string') {
|
|
const str = v[0]
|
|
if (/^[a-zA-Z]$/.test(str)) {
|
|
add(str.toLowerCase(), item)
|
|
} else if (/^[\u4e00-\u9fa5]$/.test(str)) {
|
|
const en = '*abcdefghjklmnopqrstwxyz'.split('')
|
|
let resolvedK
|
|
// #ifdef APP-PLUS
|
|
// @ts-ignore
|
|
resolvedK = en.find((k) => {
|
|
const py = pinyin(str, {
|
|
style: 'FIRST_LETTER',
|
|
})
|
|
return py[0][0] === k
|
|
})
|
|
// #endif
|
|
// #ifndef APP-PLUS
|
|
const zh = '阿八嚓哒妸发旮哈讥咔垃痳拏噢妑七呥扨它穵夕丫帀'.split('')
|
|
// @ts-ignore
|
|
resolvedK = en.find(
|
|
(currentK, ki) =>
|
|
(!zh[ki - 1] || zh[ki - 1].localeCompare(str, 'zh') <= 0) &&
|
|
str.localeCompare(zh[ki], 'zh') == -1
|
|
)
|
|
// #endif
|
|
if (resolvedK && resolvedK !== '*') {
|
|
add(resolvedK, item)
|
|
} else {
|
|
add(OTHER_TAG, item)
|
|
}
|
|
} else {
|
|
add(OTHER_TAG, item)
|
|
}
|
|
} else {
|
|
add(OTHER_TAG, item)
|
|
}
|
|
})
|
|
|
|
const data = Object.keys(res).map((k) => ({ key: k, data: res[k] }))
|
|
const sortData = data
|
|
.filter((item) => item.key !== OTHER_TAG)
|
|
.sort((a, b) => a.key.localeCompare(b.key, 'en'))
|
|
const otherData = data.filter((item) => item.key === OTHER_TAG)
|
|
|
|
return sortData.concat(otherData)
|
|
}
|