在javascript开发中,交换数组前后部分是常见的操作需求,比如将数组的前半段和后半段位置互换,或者按照指定索引分割数组后调整顺序。不同的实现方式在代码简洁度和性能上有所差异,下面介绍几种常用的实现方案。

方案一:使用slice和扩展运算符拼接
这种方案的核心思路是先通过slice方法分割数组的前后部分,再用扩展运算符将两部分拼接成新的数组,不会修改原数组。
// 定义待处理的数组 const arr = [1, 2, 3, 4, 5, 6]; // 分割点索引,这里取数组长度的一半,向下取整 const splitIndex = Math.floor(arr.length / 2); // 获取前半部分数组 const frontPart = arr.slice(0, splitIndex); // 获取后半部分数组 const backPart = arr.slice(splitIndex); // 拼接后半部分和前半部分,得到交换后的新数组 const newArr = [...backPart, ...frontPart]; console.log(newArr); // 输出 [4, 5, 6, 1, 2, 3] console.log(arr); // 原数组不变,输出 [1, 2, 3, 4, 5, 6]
方案二:使用splice方法修改原数组
如果需要直接修改原数组,可以使用splice方法删除后半部分元素,再将删除的元素插入到数组开头。
const arr = [1, 2, 3, 4, 5, 6]; const splitIndex = Math.floor(arr.length / 2); // 从splitIndex位置开始删除剩余所有元素,返回被删除的元素数组 const deletedPart = arr.splice(splitIndex); // 将删除的元素插入到数组开头 arr.unshift(...deletedPart); console.log(arr); // 原数组被修改,输出 [4, 5, 6, 1, 2, 3]
方案三:指定任意分割点交换
上述方案默认以数组中间为分割点,实际场景中可能需要指定任意索引作为分割点,只需要调整splitIndex的值即可。
function swapArrayParts(arr, splitIndex) {
// 边界判断,分割点不能小于0或大于数组长度
if (splitIndex <= 0 || splitIndex >= arr.length) {
return arr;
}
const front = arr.slice(0, splitIndex);
const back = arr.slice(splitIndex);
return [...back, ...front];
}
const testArr = ['a', 'b', 'c', 'd', 'e'];
// 以索引2为分割点,前2个元素和后3个元素交换
const result = swapArrayParts(testArr, 2);
console.log(result); // 输出 ['c', 'd', 'e', 'a', 'b']
不同方案对比
以下是几种方案的适用场景和特点对比:
| 方案 | 是否修改原数组 | 代码简洁度 | 适用场景 |
|---|---|---|---|
| slice+扩展运算符 | 否 | 高 | 需要保留原数组,追求代码可读性 |
| splice+unshift | 是 | 中等 | 允许修改原数组,减少内存占用 |
| 自定义函数 | 否 | 高 | 需要灵活指定分割点,复用性要求高 |
注意事项
- 数组长度为奇数时,
Math.floor(arr.length / 2)会让前半部分比后半部分少一个元素,如果需要前半部分多一个元素,可以改用Math.ceil(arr.length / 2)。 - 使用扩展运算符拼接大数组时,可能会有性能损耗,超大数组场景建议优先考虑
concat方法拼接。 - 如果数组是类数组对象,需要先通过
Array.from转换为真正的数组再操作。
javascript数组交换数组操作slice方法splice方法修改时间:2026-07-04 04:39:20