求无依赖库的字符串压缩优化实现:将字符串缩至指定长度(含省略号)
优化后的JavaScript字符串压缩实现(无第三方依赖)
针对你提出的字符串压缩需求,这里提供一个更严谨、符合现代JavaScript风格的实现,解决了基础版本的长度计算错误和边界情况处理问题:
function condense(s, n) { // 原字符串长度不超过限制,直接返回原串 if (s.length <= n) return s; // 限制长度小于等于3时,返回对应长度的省略号(保证标识存在) if (n <= 3) return '...'.slice(0, n); // 计算可分配给前后片段的总长度(扣除省略号的3个字符) const availableLen = n - 3; // 前片段取整数值,后片段补全剩余长度,确保总和为availableLen const preLen = Math.floor(availableLen / 2); const postLen = availableLen - preLen; // 用模板字符串拼接,负数索引简化末尾截取 return `${s.slice(0, preLen)}...${s.slice(-postLen)}`; }
关键改进点
- 正确控制最终长度:基础版本忽略了省略号的3个字符长度,导致最终结果超出限制。本实现先预留省略号的空间,再分配前后片段长度,确保最终字符串长度严格等于
n。 - 处理所有边界情况:
- 当原字符串长度≤
n时直接返回,无需额外处理 - 当
n≤3时,返回对应长度的省略号(比如n=2返回..),既满足长度要求又保留摘要标识
- 当原字符串长度≤
- 更简洁的语法:
- 使用模板字符串替代传统字符串拼接,可读性更强
- 利用
slice(-postLen)替代s.slice(s.length - postLen),符合JavaScript的简洁写法
- 避免浮点数问题:用
Math.floor和减法分配前后长度,避免基础版本中n/2产生的浮点数歧义(slice会自动取整,但逻辑不清晰)
测试示例
- 你的原示例:
let S = "some description goes here"; let N = 10; console.log(condense(S, N)); // 输出:som...here(长度10,符合要求) - 边界情况测试:
condense("abcdefgh", 3); // 输出:... condense("abcdefgh", 5); // 输出:a...h(长度5) condense("abcdefgh", 6); // 输出:a...gh(长度6) condense("short", 10); // 输出:short(原串长度≤限制)
内容的提问来源于stack exchange,提问作者Lorah Attkins
相关产品推荐
相关产品推荐

