JavaScript数组元素移除方法详解

JavaScript数组元素移除方法详解

技术背景

在JavaScript开发中,经常需要对数组中的元素进行移除操作。不同的移除需求和场景下,有多种不同的方法可供选择。了解这些方法的使用方式、特点以及性能差异,对于写出高效、稳定的代码至关重要。

实现步骤

使用indexOfsplice方法

可以使用indexOf方法找到要移除元素的索引,再使用splice方法移除该元素。

1
2
3
4
5
6
const array = [2, 5, 9];
const index = array.indexOf(5);
if (index > -1) {
array.splice(index, 1);
}
console.log(array);

还可以封装成函数,分别实现移除单个和所有匹配元素的功能:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
function removeItemOnce(arr, value) {
var index = arr.indexOf(value);
if (index > -1) {
arr.splice(index, 1);
}
return arr;
}

function removeItemAll(arr, value) {
var i = 0;
while (i < arr.length) {
if (arr[i] === value) {
arr.splice(i, 1);
} else {
++i;
}
}
return arr;
}

使用filter方法

filter方法可以创建一个新数组,包含所有符合条件的元素,从而实现移除不符合条件元素的效果。

1
2
3
4
let value = 3;
let arr = [1, 2, 3, 4, 5, 3];
arr = arr.filter(item => item !== value);
console.log(arr);

使用delete操作符

delete操作符可以删除数组中的元素,但会留下空槽,且不会更新数组的length属性。

1
2
3
let fruits = ['Apple', 'Banana', 'Mango', 'Orange'];
let removed = delete fruits[2];
console.log(fruits);

核心代码

TypeScript类型安全函数

1
2
3
4
5
6
7
function removeItem<T>(arr: Array<T>, value: T): Array<T> {
const index = arr.indexOf(value);
if (index > -1) {
arr.splice(index, 1);
}
return arr;
}

移除多个元素

1
2
3
4
let forDeletion = [2, 3, 5];
let arr = [1, 2, 3, 4, 5, 3];
arr = arr.filter(item => !forDeletion.includes(item));
console.log(arr);

自定义移除函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
var helper = {
// 移除并返回第一个匹配元素
remove: function(array, predicate) {
for (var i = 0; i < array.length; i++) {
if (predicate(array[i])) {
return array.splice(i, 1);
}
}
},
// 移除并返回所有匹配元素
removeAll: function(array, predicate) {
var removed = [];
for (var i = 0; i < array.length; ) {
if (predicate(array[i])) {
removed.push(array.splice(i, 1));
continue;
}
i++;
}
return removed;
}
};

最佳实践

  • 性能优先:当数组元素较多时,避免使用filter方法频繁创建新数组,可考虑使用move函数。
1
2
3
4
5
6
7
8
9
function move(arr, val) {
var j = 0;
for (var i = 0, l = arr.length; i < l; i++) {
if (arr[i] !== val) {
arr[j++] = arr[i];
}
}
arr.length = j;
}
  • 保持代码简洁:优先使用标准的JavaScript函数,如indexOfsplicefilter等。
  • 兼容性处理:对于不支持的方法,如array.includes() => {}箭头函数等,可使用core-js进行填充或使用BabelJS进行转换。

常见问题

  • 使用delete操作符的问题:使用delete操作符会留下空槽,且不会更新数组的length属性,可能导致for循环出现问题,建议使用splice方法。
  • filter方法的性能问题filter方法会创建新数组,当数组元素较多时,会有较大的性能开销。
  • 自定义函数的兼容性问题:扩展Array.prototype可能会导致命名冲突,建议尽量避免。

JavaScript数组元素移除方法详解
https://119291.xyz/posts/2025-05-06.javascript-array-element-removal-methods/
作者
ww
发布于
2025年5月6日
许可协议