如何仅使用pop()方法删除JavaScript数组中指定索引的元素
JavaScript 仅用pop()实现删除数组指定索引元素的高效方案
现有实现的可优化点
你当前的版本可以正常运行,但存在两处可优化的空间:
- 需要额外创建长度和原数组接近的新数组,占用了O(n)的额外内存
- 循环需要遍历整个原数组的全部元素,遍历次数可以进一步压缩
高效实现方案
核心思路是直接在原数组上操作,不需要额外开辟数组空间,仅遍历待删除索引之后的元素:
- 先做索引合法性校验,索引越界直接返回原数组
- 把待删除索引之后的所有元素逐个向前挪一位,覆盖掉要删除的元素
- 最后调用一次
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
相关产品推荐
相关产品推荐

