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

JavaScript数组插入元素位置错误及重复问题求解

问题修复与替代方案

原代码问题分析

  1. 插入位置错误:index + 1仅做数值计算未赋值,实际插入位置仍是z的索引,导致所有大写字母被插入到z前面,z被后续插入操作挤到最后。
  2. 元素取值偏移:循环中每次splice会修改原数组长度,后续的splitted[i]会取到之前插入的大写字母(如循环后期i超过原数组初始长度时),造成重复。
  3. 循环次数僵化:固定循环23次,无法适配输入内容变化,逻辑不够灵活。

修复方案(一次性插入法)

先提取需要转大写的字符,再一次性插入到z的后方,避免数组动态修改带来的索引问题:

const splitMatrix = async (inputMatrix: string) => {
  let splitted = inputMatrix.split(''); 
  const zIndex = splitted.indexOf("z");
  if (zIndex === -1) return splitted; // 无z时直接返回原数组

  // 筛选出a-y的小写字母并转为大写
  const uppercaseChars = splitted
    .filter(char => /[a-y]/.test(char))
    .map(char => char.toUpperCase());

  // 在z的下一个位置插入所有大写字母
  splitted.splice(zIndex + 1, 0, ...uppercaseChars);

  return splitted;
}

替代思路(数组切片拼接法)

不修改原数组,通过切片拆分后再拼接,逻辑更直观:

const splitMatrix = async (inputMatrix: string) => {
  const splitted = inputMatrix.split('');
  const zIndex = splitted.indexOf("z");
  if (zIndex === -1) return splitted;

  // 拆分数组为包含z的前半部分、z之后的部分
  const beforeZ = splitted.slice(0, zIndex + 1);
  const afterZ = splitted.slice(zIndex + 1);
  // 生成需要插入的大写字母数组
  const uppercaseChars = splitted
    .filter(c => /[a-y]/.test(c))
    .map(c => c.toUpperCase());

  // 拼接成新数组返回
  return [...beforeZ, ...uppercaseChars, ...afterZ];
}

内容的提问来源于stack exchange,提问作者newbiedev

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 06:05:54