JavaScript如何用for loop实现字符串trim功能并排查现有代码错误
问题定位与修复方案
核心问题出在splice方法的使用逻辑错误,完全偏离了你预期的删除效果:
1. 具体错误原因
splice(start, deleteCount) 方法如果只传入1个参数,会直接删除数组从start索引开始到末尾的所有元素:
- 执行
killLeftToRight时,第一个字符是空格,直接触发charArr.splice(0+1),把数组从索引1开始的所有元素全部删除,数组就只剩第一个空格字符,这就是你最终只得到单个空格数组的直接原因。 killRightToLeft的逻辑也存在效率问题,每次匹配到空格只删一个字符,遍历次数冗余,而且你先删右边再删左边的调用顺序也会增加不必要的计算量。
2. 优化后的实现方案
不需要频繁调用splice修改原数组,直接记录首尾第一个非空格的索引,最后截取有效区间即可,性能更高:
const stringWithManyWhiteSpaces = ' I like ants... Remember us '; const charArray = [...stringWithManyWhiteSpaces]; function myTrim(charArr) { let start = 0; let end = charArr.length - 1; // 定位左侧第一个非空格索引 while (start <= end && charArr[start] === ' ') start++; // 定位右侧第一个非空格索引 while (end >= start && charArr[end] === ' ') end--; // 截取中间有效部分 return charArr.slice(start, end + 1); } const trimmedArr = myTrim(charArray); console.log(trimmedArr); // 需要转字符串直接调用join即可:trimmedArr.join('')
若要保留你原本的splice写法,调整删除逻辑即可修复:
const stringWithManyWhiteSpaces = ' I like ants... Remember us '; function killLeftToRight(charArr) { // 每次只删第一个空格,第二个参数为删除元素个数 while (charArr[0] === ' ') charArr.splice(0, 1); } function killRightToLeft(charArr) { // 每次只删最后一个空格 while (charArr[charArr.length - 1] === ' ') charArr.splice(charArr.length - 1, 1); } function myTrim(){ // 复制原数组操作,避免污染原变量 const charArray = [...stringWithManyWhiteSpaces]; killLeftToRight(charArray); killRightToLeft(charArray) console.log(charArray) } myTrim();
内容的提问来源于stack exchange,提问作者Julio Rodríguez
相关产品推荐
相关产品推荐

