73 lines
2.1 KiB
JavaScript
73 lines
2.1 KiB
JavaScript
'use client';
|
|
|
|
/**
|
|
* 按照标签前面的序号对标签进行排序
|
|
* @param {Array} tags - 标签数组
|
|
* @returns {Array} 排序后的标签数组
|
|
*/
|
|
export const sortTagsByNumber = tags => {
|
|
return [...tags].sort((a, b) => {
|
|
// 提取标签前面的序号
|
|
const getNumberPrefix = label => {
|
|
// 匹配形如 1, 1.1, 1.1.2 的序号
|
|
const match = label.match(/^([\d.]+)\s/);
|
|
if (match) {
|
|
return match[1]; // 返回完整的序号字符串,如 "1.10"
|
|
}
|
|
return null; // 没有序号
|
|
};
|
|
|
|
const aPrefix = getNumberPrefix(a.label);
|
|
const bPrefix = getNumberPrefix(b.label);
|
|
|
|
// 如果两个标签都有序号,按序号比较
|
|
if (aPrefix && bPrefix) {
|
|
// 将序号分解为数组,然后按数值比较
|
|
const aParts = aPrefix.split('.').map(num => parseInt(num, 10));
|
|
const bParts = bPrefix.split('.').map(num => parseInt(num, 10));
|
|
|
|
// 比较序号数组
|
|
for (let i = 0; i < Math.min(aParts.length, bParts.length); i++) {
|
|
if (aParts[i] !== bParts[i]) {
|
|
return aParts[i] - bParts[i]; // 数值比较,确保 1.2 排在 1.10 前面
|
|
}
|
|
}
|
|
// 如果前面的数字都相同,则较短的序号在前
|
|
return aParts.length - bParts.length;
|
|
}
|
|
// 如果只有一个标签有序号,则有序号的在前
|
|
else if (aPrefix) {
|
|
return -1;
|
|
} else if (bPrefix) {
|
|
return 1;
|
|
}
|
|
// 如果都没有序号,则按原来的字母序排序
|
|
else {
|
|
return a.label.localeCompare(b.label, 'zh-CN');
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* 获取标签的完整路径
|
|
* @param {Object} tag - 标签对象
|
|
* @param {Array} allTags - 所有标签数组
|
|
* @returns {string} 标签路径,如 "标签1 > 标签2 > 标签3"
|
|
*/
|
|
export const getTagPath = (tag, allTags) => {
|
|
if (!tag) return '';
|
|
|
|
const findPath = (currentTag, path = []) => {
|
|
const newPath = [currentTag.label, ...path];
|
|
|
|
if (!currentTag.parentId) return newPath;
|
|
|
|
const parentTag = allTags.find(t => t.id === currentTag.parentId);
|
|
if (!parentTag) return newPath;
|
|
|
|
return findPath(parentTag, newPath);
|
|
};
|
|
|
|
return findPath(tag).join(' > ');
|
|
};
|