比Array.prototype.splice()更快的删除数组元素方法

666 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

Array.prototype.splice()是最常用的从数组中删除元素的方法。事实证明,这并不是最快的。如果您对大型数组执行许多操作,这可能是影响代码性能的一个特别重要的因素。

目录

  • Array.prototype.splice()
  • 更快的方法

Array.prototype.splice()

splice()  方法通过删除或替换现有元素或者原地添加新的元素来修改数组,并以数组形式返回被修改的内容。此方法会改变原数组。

image.png

看到splice在运行是,主要是靠循环遍历类数组元素,然后返回一个被修改的内容。

如果在操作大型数组的时候,

更快的方法

可以使用一个非常简单的技巧来加快此操作,但是不能要求数组按照一定顺序排列。

  • 将任何元素与最后一个元素交换
  • 利用Array.prototype.pop()删除最后一个元素

例如:

const arr = [3, 1, 5, 7, 9];    // 想删除5 (index: 2)

arr[2] = arr[arr.length -1]; 
// 将最后一个元素拷贝到index:2的位置
arr.pop();                      // 删除最后一个元素

看一下测试:

let myCars = new Array(10000);
for (let index = 0; index < 10000; index++) {
    myCars[index] = index+"test"
}

// splice方法
console.time("timer");
myCars.splice(5621,1)
console.timeEnd("timer");

// pop方法
console.time("timer");
myCars[5621] = myCars[myCars.length-1]
myCars.pop()
console.timeEnd("timer");

有人可能会认为将其缩短到arr[i] = arr.pop()会使其更加简洁。事实证明并非如此,因为如果我们尝试删除数组中的最后一个元素,这个较短的版本将会失败。

总结

  • 替换+pop()的方法比splice方法更快速
  • 替换+pop()的方法适用于数组不要求顺序
  • splice()会对原数组的元素改变,可能向后移动,可能向前移动,这些都会做循环遍历,最好的情况就是替换元素。