You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

不修改原数组且禁用.reverse()与高阶函数,JS数组反转的其他实现方法?

几种禁用reverse()和高阶函数的数组反转实现方法

嘿,很高兴看到你在尝试用不同思路解决JS数组反转的问题!先提个小细节:你给出的示例代码里有几处问题——pop(i)其实不需要参数(它默认删除最后一个元素),而且unshift(i)是把循环变量i插入到数组开头,不是原数组的元素,所以运行结果会不符合预期。不过没关系,下面我给你分享几个符合要求的实现方式,都不会修改原数组,也不用reverse()map这类高阶函数:

方法1:双指针交换法(在复制数组上操作)

这是效率比较高的一种方式,通过两个指针从数组两端向中间移动,交换对应位置的元素:

const newArray = [1,2,3,4,5,6];
const reverseArray = () => {
  // 先复制原数组,确保不修改原数组
  const arr = [...newArray];
  let left = 0;
  let right = arr.length - 1;
  
  while (left < right) {
    // 交换左右指针的元素
    const temp = arr[left];
    arr[left] = arr[right];
    arr[right] = temp;
    // 移动指针,向中间靠拢
    left++;
    right--;
  }
  return arr;
};

console.log(reverseArray()); // 输出: [6,5,4,3,2,1]
console.log(newArray); // 原数组保持不变: [1,2,3,4,5,6]

方法2:从后往前遍历构建新数组

直接创建一个空数组,从原数组的最后一个元素开始,逐个添加到新数组中,完全不触碰原数组:

const newArray = [1,2,3,4,5,6];
const reverseArray = () => {
  const reversed = [];
  // 从原数组的最后一个索引开始遍历
  for (let i = newArray.length - 1; i >= 0; i--) {
    reversed.push(newArray[i]);
  }
  return reversed;
};

console.log(reverseArray()); // 输出: [6,5,4,3,2,1]
console.log(newArray); // 原数组未被修改

方法3:利用pop()构建反转数组

借助pop()方法(这属于数组基础方法,不在禁用范围内),从复制后的数组末尾逐个取出元素,添加到新数组中:

const newArray = [1,2,3,4,5,6];
const reverseArray = () => {
  // 复制原数组,避免修改原数组
  const arr = [...newArray];
  const reversed = [];
  // 当复制数组还有元素时,持续取出最后一个元素
  while (arr.length > 0) {
    reversed.push(arr.pop());
  }
  return reversed;
};

console.log(reverseArray()); // 输出: [6,5,4,3,2,1]
console.log(newArray); // 原数组保持原样

修正你原思路的实现

如果你想保留用unshift()的思路,应该把原数组的元素逐个插入到新数组开头,而不是循环变量i

const newArray = [1,2,3,4,5,6];
const reverseArray = () => {
  const reversed = [];
  for (let i = 0; i < newArray.length; i++) {
    // 将原数组的当前元素插入到新数组开头
    reversed.unshift(newArray[i]);
  }
  return reversed;
};

console.log(reverseArray()); // 输出: [6,5,4,3,2,1]

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

火山引擎 最新活动