JavaScript数组插入元素位置错误及重复问题求解
问题修复与替代方案
原代码问题分析
- 插入位置错误:
index + 1仅做数值计算未赋值,实际插入位置仍是z的索引,导致所有大写字母被插入到z前面,z被后续插入操作挤到最后。 - 元素取值偏移:循环中每次
splice会修改原数组长度,后续的splitted[i]会取到之前插入的大写字母(如循环后期i超过原数组初始长度时),造成重复。 - 循环次数僵化:固定循环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
相关产品推荐
相关产品推荐

