You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将字符串中大写字母移至开头并优化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(""); 
}

代码解释

  1. 倒序遍历:从数组最后一位开始往前循环,避免移除元素导致的索引混乱问题;
  2. 移除大写字母:每次找到大写字母后,用sp.splice(i, 1)直接从原数组中删掉它;
  3. 反转大写数组:因为我们是倒序收集的大写字母,所以最后要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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 15:22:55