如何将字符串中大写字母移至开头并优化JavaScript代码?
解决大写字母移至字符串开头的优化方案
嘿,你的思路其实已经很清晰了!想在收集大写字母的同时直接从原数组里移除它们,避免额外写第二个条件,这个想法非常务实。不过这里有个容易踩的小坑:如果正向遍历数组时直接移除元素,会导致后续元素的索引错位——比如你移除了第i个元素,下一个元素会自动补到第i位,但循环的i会继续递增,这样就会漏掉这个补位的元素。
优化方案:倒序遍历数组
我们可以改成倒序遍历,这样移除元素时不会影响还没遍历到的前面的元素(因为我们从后往前处理,前面的元素索引还没被访问到)。修改后的代码如下:
function capToFront(s) { let sp = s.split(""); let caps = []; // 从数组末尾开始倒序遍历 for (let i = sp.length - 1; i >= 0; i--) { if (sp[i] === sp[i].toUpperCase()){ caps.push(sp[i]); // 从原数组中移除当前找到的大写字母 sp.splice(i, 1); } } // 注意:倒序收集的大写字母是反向的,需要反转后再拼接 return caps.reverse().join("") + sp.join(""); }
代码解释
- 倒序遍历:从数组最后一位开始往前循环,避免移除元素导致的索引混乱问题;
- 移除大写字母:每次找到大写字母后,用
sp.splice(i, 1)直接从原数组中删掉它; - 反转大写数组:因为我们是倒序收集的大写字母,所以最后要
reverse()把它们恢复成原顺序,再和剩下的小写字母拼接。
更简洁的替代写法
如果不想纠结遍历的索引问题,也可以用数组的filter方法直接分离大写和小写字母,代码更简洁:
function capToFront(s) { const chars = s.split(""); // 过滤出所有大写字母 const caps = chars.filter(char => char === char.toUpperCase()); // 过滤出所有小写字母 const lowers = chars.filter(char => char === char.toLowerCase()); return caps.join("") + lowers.join(""); }
两种方法都能实现'heLLo' → 'LLheo'的预期效果,你可以根据自己的习惯选择~
内容的提问来源于stack exchange,提问作者Rind
相关产品推荐
相关产品推荐

