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

如何仅使用pop()方法删除JavaScript数组中指定索引的元素

JavaScript 仅用pop()实现删除数组指定索引元素的高效方案

现有实现的可优化点

你当前的版本可以正常运行,但存在两处可优化的空间:

  • 需要额外创建长度和原数组接近的新数组,占用了O(n)的额外内存
  • 循环需要遍历整个原数组的全部元素,遍历次数可以进一步压缩

高效实现方案

核心思路是直接在原数组上操作,不需要额外开辟数组空间,仅遍历待删除索引之后的元素:

  1. 先做索引合法性校验,索引越界直接返回原数组
  2. 把待删除索引之后的所有元素逐个向前挪一位,覆盖掉要删除的元素
  3. 最后调用一次pop()删除数组末尾冗余的重复元素即可,全程仅用到pop()这一个数组方法,符合要求

实现代码如下:

function removeAt(arr, index) {
  // 索引越界直接返回原数组
  if (index < 0 || index >= arr.length) return arr
  // 从待删除索引开始,后面的元素逐个往前挪一位
  for (let i = index; i < arr.length - 1; i++) {
    arr[i] = arr[i + 1]
  }
  // 删除末尾冗余的元素
  arr.pop()
  return arr
}

// 测试用例
console.log(removeAt([1,2,3,4], 2)) // 输出 [1,2,4]
console.log(removeAt([1,2,3,4,5], 3)) // 输出 [1,2,3,5]

效率对比

实现版本时间复杂度空间复杂度
你当前的版本O(n) 全量遍历O(n) 需要创建新数组
优化后的版本O(k) k为待删除索引到数组末尾的长度,最差情况才到O(n)O(1) 无额外内存开销

如果需要不修改原数组的版本,只需要先手动循环拷贝原数组再执行上面的逻辑即可,全程依然只用pop():

function removeAtImmutable(arr, index) {
  // 手动拷贝原数组,不使用其他数组方法
  const newArr = []
  for (let i = 0; i < arr.length; i++) {
    newArr[i] = arr[i]
  }
  // 索引越界直接返回拷贝后的数组
  if (index < 0 || index >= arr.length) return newArr
  for (let i = index; i < newArr.length - 1; i++) {
    newArr[i] = newArr[i + 1]
  }
  newArr.pop()
  return newArr
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:45:04