JS处理对象数组姓名:正确移除(T1)/(T2)后缀保留完整原值
对象数组姓名字段移除固定后缀实现方案
问题复现
相关测试数据、错误写法、实际输出与预期效果如下:
原始数据源:
const agent = [ { "agent-name": "Jm Fajardo", "gender": "Male" }, { "agent-name": "Lem Cruz (T1)", "gender": "Male" }, { "agent-name": "Levi Fajarda (T2)", "gender": "Male" }, { "agent-name": "Ian Pacido", "gender": "Male" } ];
错误的遍历处理逻辑:
$.each(agent, function (key, value) { var sliced = value["agent-name"].slice(0, -5); console.log("agent :", sliced); });
执行后不符合预期的输出:
agent : Jm Fa agent : Lem Cruz agent : Levi Fajarda agent : Ian P
预期输出结果:
agent : Jm Fajardo agent : Lem Cruz agent : Levi Fajarda agent : Ian Pacido
错误原因
固定长度切片的逻辑没有做后缀存在性判断: (T1)、 (T2)算上括号前的空格,总长度刚好是5个字符,所以带后缀的姓名执行slice(0,-5)能得到正确结果,但不带后缀的姓名会被强制切掉最后5个字符,自然会出现内容截断的问题。
修复方法
核心逻辑是先判断姓名末尾是否存在要移除的(T1)/(T2)后缀,存在再做截取处理,不存在直接返回原始姓名,两种常用实现方式可选:
方法1:正则替换(兼容性最好)
正则可以自动适配后缀前的空格数量,也能兼容后续出现T3、T4等更多职级后缀的场景,代码如下:
$.each(agent, function (key, value) { const name = value["agent-name"]; // 匹配字符串末尾的 (T+数字) 格式后缀,替换为空 const finalName = name.replace(/\s*\(T\d+\)$/, '').trim(); console.log("agent :", finalName); });
如果只需要严格匹配(T1)、(T2)两种后缀,把正则改成/\s*\(T[12]\)$/即可。
方法2:后缀判断+固定切片(逻辑直观)
如果确定后缀格式固定、和姓名之间只有一个空格,也可以先判断后缀再切片:
$.each(agent, function (key, value) { const name = value["agent-name"]; let finalName = name; // 检测末尾是否匹配目标后缀 if (name.endsWith('(T1)') || name.endsWith('(T2)')) { finalName = name.slice(0, -5).trim(); } console.log("agent :", finalName); });
两种写法执行后都能得到预期的输出结果。
内容的提问来源于stack exchange,提问作者Lem Fajarda
相关产品推荐
相关产品推荐

