HOWTO · JavaScript

在 JavaScript 中从数组中删除第一个元素

本文介绍如何从 JavaScript 数组中删除第一个元素,并说明几种常用方法。

本页内容

要从 JavaScript 数组中删除第一个元素,可以使用 shift() 或 splice(0, 1) 修改原数组。如果要保留原数组,可以使用 slice(1) 或 filter() 创建新数组。shift() 会以单个值的形式返回被删除的元素,而 splice(0, 1) 会将其放在一个数组中返回。

通过修改原数组删除第一个元素

shift() 和 splice() 都会从原数组中删除元素。若要始终删除第一个元素,请选择 shift();若要按指定索引执行相同操作或删除多个元素,请选择 splice()。

shift() 会删除索引 0 处的元素,将其余元素向前移动,并返回被删除的值。运行下面的示例,可以查看更新后的数组和返回的元素;输出中的字段名沿用英文,便于与代码中的变量对应:

本节中的代码以及显示的标签或输出仍为英文。

const items = ["first", "second", "third"];
const removed = items.shift();
console.log(JSON.stringify({ items, removed }));
{"items":["second","third"],"removed":"first"}

执行这些语句后,items 包含最后两个字符串,removed 则包含 "first"。在 JavaScript 运行时中,JSON.stringify() 会将打印的对象转换为单行 JSON。

如果需要指定位置,请使用 splice(start, deleteCount)。要删除第一个元素,将 0 作为 start、将 1 作为 deleteCount 传入。该方法会修改原数组,并返回一个包含被删除元素的数组。例如,若 const values = ["red", "green", "blue"],执行 const removed = values.splice(0, 1) 后,values 变为 ["green", "blue"],而 removed 的值为 ["red"]。

start 参数指定索引,不表示移动方向。非负索引从数组开头计数,负索引则从末尾倒数(-1 指向最后一个元素)。deleteCount 指定从该位置删除多少个元素。如果省略它,splice() 会删除从 start 开始的所有元素。放在 deleteCount 之后的元素会插入该位置。有关此方法全部参数行为的说明,请参阅 MDN 的 splice() 参考文档。

不修改原数组而删除第一个元素

slice() 和 filter() 都会返回新数组,并保持输入数组不变。要直接复制第一个元素之后的所有内容,可以使用 slice(1)。结果包含 start 索引处的元素,但不包含可选的 end 索引处的元素。因此,values.slice(1) 会从索引 1 复制到数组末尾;它不会删除 values 中的任何元素。更多详情请参阅 slice() 指南 和 MDN 的 slice() 参考文档。目前没有提供该指南的中文版本,因此此链接指向英文页面。

如果要根据条件决定删除哪些元素,请使用 filter()。它会为每个元素运行回调函数,并将回调返回 true 的元素放入新数组。若只想跳过第一个位置,可以按索引筛选:

const remaining = values.filter((item, index) => index > 0);

这样会按原有顺序保留后续元素,同时保留 values 不变。按索引筛选表达的是位置规则;即使数组已经重新排序,它仍会排除索引 0 处的元素,无论该元素的值是什么。

例如,若 const values = ["red", "green", "blue"],values.slice(1) 和 values.filter((item, index) => index > 0) 都会生成包含 ["green", "blue"] 的新数组,而 values 仍为 ["red", "green", "blue"]。

根据数组需求选择合适的方法

  • 如果需要修改原数组,并希望以单个值的形式取得被删除的元素,请使用 shift()。
  • 如果需要修改原数组,且希望以数组形式取得被删除的元素,请使用 splice(0, 1);也可以调整索引和数量,从其他位置删除元素。
  • 如果要创建一个包含第一个元素之后所有内容的新数组,请使用 slice(1)。
  • 如果要根据条件决定保留哪些元素,请使用 filter();按索引设置条件即可跳过第一个位置。

关键在于其他代码是否仍需要使用原数组。会修改数组的方法会更新这个共享数组,因此所有引用它的代码都会看到变化。不修改原数组的方法会保留原数组,并返回独立结果。这四种方法都会维持保留元素的相对顺序。