6
This commit is contained in:
@@ -50,6 +50,96 @@ export const getDbDir = () => {
|
||||
});
|
||||
});
|
||||
};
|
||||
export const formatIndexListData = (list, key = "nickname") => {
|
||||
// 兼容:list 为数组,数组元素可以是字符串或对象;key 为要分组的字段名(若元素为字符串则忽略 key)
|
||||
if (!Array.isArray(list) || list.length === 0) return [];
|
||||
|
||||
const ucfirst = (l1) => {
|
||||
if (!l1) return "";
|
||||
if (l1.length > 0) {
|
||||
var first = l1.substr(0, 1).toUpperCase();
|
||||
var spare = l1.substr(1, l1.length);
|
||||
return first + spare;
|
||||
}
|
||||
return l1;
|
||||
};
|
||||
|
||||
const arraySearch = (l1) => {
|
||||
for (var name in PinYin) {
|
||||
if (PinYin[name].indexOf(l1) != -1) {
|
||||
return ucfirst(name);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
// 将字符串转为可排序的拼音/字母表示
|
||||
const codefans = (l1) => {
|
||||
l1 = l1 ?? "";
|
||||
var l2 = l1.length;
|
||||
var I1 = "";
|
||||
var reg = new RegExp("[a-zA-Z0-9- ]");
|
||||
for (var i = 0; i < l2; i++) {
|
||||
var val = l1.substr(i, 1);
|
||||
var name = arraySearch(val);
|
||||
if (reg.test(val)) {
|
||||
I1 += val;
|
||||
} else if (name !== false) {
|
||||
I1 += name;
|
||||
}
|
||||
}
|
||||
I1 = I1.replace(/ /g, "-");
|
||||
while (I1.indexOf("--") > 0) {
|
||||
I1 = I1.replace("--", "-");
|
||||
}
|
||||
return I1;
|
||||
};
|
||||
|
||||
// 构建分组 map
|
||||
const groups = {};
|
||||
for (let i = 0; i < list.length; i++) {
|
||||
const item = list[i];
|
||||
const val = (typeof item === "string") ? item : (item && item[key]) ? item[key] : "";
|
||||
const coded = codefans(String(val));
|
||||
let initial = (coded && coded.length > 0) ? coded.substr(0, 1).toUpperCase() : "#";
|
||||
if (!/^[A-Z]$/.test(initial)) initial = "#";
|
||||
if (!groups[initial]) groups[initial] = [];
|
||||
groups[initial].push({
|
||||
raw: item,
|
||||
sortKey: coded || String(val)
|
||||
});
|
||||
}
|
||||
|
||||
// 按字母顺序构建结果,A-Z 然后 #
|
||||
const letters = Object.keys(groups).filter((l) => l !== "#").sort();
|
||||
const result = [];
|
||||
for (const L of letters) {
|
||||
// 组内按照 sortKey 排序
|
||||
groups[L].sort((a, b) => {
|
||||
if (a.sortKey < b.sortKey) return -1;
|
||||
if (a.sortKey > b.sortKey) return 1;
|
||||
return 0;
|
||||
});
|
||||
result.push({
|
||||
letter: L,
|
||||
data: groups[L].map((x) => x.raw)
|
||||
});
|
||||
}
|
||||
// 特殊字符组放最后
|
||||
if (groups["#"] && groups["#"].length > 0) {
|
||||
groups["#"].sort((a, b) => {
|
||||
if (a.sortKey < b.sortKey) return -1;
|
||||
if (a.sortKey > b.sortKey) return 1;
|
||||
return 0;
|
||||
});
|
||||
result.push({
|
||||
letter: "#",
|
||||
data: groups["#"].map((x) => x.raw)
|
||||
});
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
export const formatChooseData = (data, key = "nickname") => {
|
||||
const ucfirst = (l1) => {
|
||||
|
||||
Reference in New Issue
Block a user