数组交替元素交换实现:现有硬编码代码不合理,求正确方案
实现数组交替奇数索引元素的镜像交换
需求说明
需要将数组中奇数索引的元素与对应的镜像位置奇数索引元素交换,偶数索引元素保持不变。示例:
- 原数组:
[8,7,4,6,9,3,2,1] - 结果数组:
[8,1,4,3,9,6,2,7]
原实现的问题
你提供的代码通过硬编码每个索引的返回值,完全不具备通用性——只要数组长度发生变化,代码就会失效,且维护成本极高,无法适配任意符合该规则的数组。
正确实现方式
方法一:原地交换(高效节省内存)
直接修改原数组,仅遍历前半部分的奇数索引完成交换:
let arr = [8, 7, 4, 6, 9, 3, 2, 1]; const len = arr.length; // 遍历前半段的奇数索引,步长为2 for (let i = 1; i < len / 2; i += 2) { // 计算当前奇数索引对应的镜像位置 const mirrorIndex = len - i; // 解构赋值快速交换元素 [arr[i], arr[mirrorIndex]] = [arr[mirrorIndex], arr[i]]; } console.log(arr); // 输出: [8, 1, 4, 3, 9, 6, 2, 7]
方法二:生成新数组(不修改原数组)
通过map遍历生成新数组,保留原数组不变:
const arr = [8, 7, 4, 6, 9, 3, 2, 1]; const len = arr.length; const newArr = arr.map((val, index) => { // 偶数索引直接返回原元素 if (index % 2 === 0) { return val; } // 奇数索引返回镜像位置的元素 const mirrorIndex = len - index; return arr[mirrorIndex]; }); console.log(newArr); // 输出: [8, 1, 4, 3, 9, 6, 2, 7]
通用性说明
这两种方法都适配任意长度的数组:
- 若数组长度为偶数:所有奇数索引都能找到对应的镜像奇数索引完成交换
- 若数组长度为奇数:中间位置的奇数索引(如长度为9时的索引4)镜像位置为自身,交换后元素不变,符合规则
内容的提问来源于stack exchange,提问作者Prasanna Kumar
相关产品推荐
相关产品推荐

