Files
YG-Datasets/easy-dataset-main/components/distill/utils.js

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(' > ');
};