不改变原数组的情况下从JavaScript数组中删除元素

正如在之前的一篇文章中提到的,Array.prototype.splice() 经常被用来从数组中删除元素。它也可以向数组中插入元素,但它总是改变原数组。很多时候,这并不是你真正想要的,所以让我们来看看如何实现一个不改变原数组的 Array.prototype.splice() 版本。

Array.prototype.splice() 的核心行为如下:

  1. 保留数组开始到给定索引之间的元素。
  2. 从给定索引开始,删除指定数量的元素。
  3. 插入给定的元素(如果有的话)到给定索引之后。
  4. 保留剩余的元素。

通过分解这个行为,我们可以很容易地使用 Array.prototype.slice()Array.prototype.concat() 来实现它。

const shank = (arr, index = 0, delCount = 0, ...elements) =>
  arr
    .slice(0, index)
    .concat(elements)
    .concat(arr.slice(index + delCount));

const names = ['alpha', 'bravo', 'charlie'];
const namesAndDelta = shank(names, 1, 0, 'delta');
// [ 'alpha', 'delta', 'bravo', 'charlie' ]
const namesNoBravo = shank(names, 1, 1); // [ 'alpha', 'charlie' ]
console.log(names); // ['alpha', 'bravo', 'charlie']