Angular+TS生成含所有单词字符的唯一编码需求
编码生成工具优化实现(Angular+TS)
问题现状
当前实现的编码生成逻辑存在缺陷:输入「Project Tracker Tool & Category Beta (BET)」时,输出为PROTTERTBET这类结果,因仅截取前8字符导致「Tool」这类单词完全未被包含,不符合业务需求。
需求明确
- 每个单词至少保留1个字符
- 字符严格遵循原输入顺序,不打乱
- 主体编码(itemName部分)最多8字符,可按单词分配字符数(如3+3+2的组合)
- 短输入(如「Tool」)直接使用全词
- 6字符单词(如MyItem)可保留全词或缩写为MYITM
- 支持生成多种不同输出结果(例如「Project Tracker Tool」可输出PRJTRTOL或PJCTTKTL)
实现方案
以下是符合需求的TS工具函数,可直接在Angular项目中使用:
// 编码生成工具函数 export function generateCode(input: string): string { // 拆分主体名称与标签(过滤&、()等分隔符) const parts = input.split(/[&()]/).map(part => part.trim()).filter(Boolean); const mainPart = parts[0] || ''; const tagPart = parts[1] || ''; // 提取主体单词列表 const words = mainPart.split(/\s+/).filter(word => word.length > 0); if (words.length === 0) return ''; const maxMainLength = 8; let remainingChars = maxMainLength; // 初始化:每个单词至少分配1个字符 const charAllocations = words.map(() => { remainingChars--; return 1; }); // 随机分配剩余字符,实现多结果输出 while (remainingChars > 0) { // 筛选还能扩展字符的单词(当前分配数 < 单词长度) const eligibleIndices = charAllocations .map((alloc, idx) => alloc < words[idx].length ? idx : -1) .filter(idx => idx !== -1); if (eligibleIndices.length === 0) break; const randomIdx = eligibleIndices[Math.floor(Math.random() * eligibleIndices.length)]; charAllocations[randomIdx]++; remainingChars--; } // 按分配数提取字符并拼接 const mainCode = words.map((word, idx) => word.slice(0, charAllocations[idx]).toUpperCase() ).join(''); // 拼接标签部分(如果存在) return tagPart ? `${mainCode}${tagPart.toUpperCase()}` : mainCode; } // 测试用例 console.log(generateCode('Project Tracker Tool')); // 输出示例:PRJTRTOL / PJCTTKTL console.log(generateCode('Tool')); // 输出:TOOL console.log(generateCode('MyItem')); // 输出示例:MYITEM / MYITM console.log(generateCode('Project Tracker Tool & Category Beta (BET)')); // 输出示例:PRJTRTBET / PJCTTLBET
关键逻辑说明
- 输入拆分:将主体名称与括号、&分隔的标签分离,避免标签占用主体的字符配额
- 字符分配:先保证每个单词至少1个字符,剩余字符随机分配给可扩展的单词,满足多结果生成需求
- 字符提取:严格按原单词顺序截取字符,确保输出顺序与输入一致
- 边界处理:短单词直接取全词,6字符单词可随分配逻辑保留全词或缩写
内容的提问来源于stack exchange,提问作者Wicked
相关产品推荐
相关产品推荐

