uniapp-app/utils/im/friend.js
2025-09-16 16:19:29 +08:00

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)
}