我有一个整数数组,我正在使用 .push()
向其添加元素的方法。
有没有一种简单的方法从数组中删除特定元素?相当于像 array.remove(int);
。
我必须使用 核心 JavaScript - 没有 框架是允许的。
我有一个整数数组,我正在使用 .push()
向其添加元素的方法。
有没有一种简单的方法从数组中删除特定元素?相当于像 array.remove(int);
。
我必须使用 核心 JavaScript - 没有 框架是允许的。
找出 index
要删除的数组元素,然后删除该索引 splice
。
splice()方法通过删除来更改数组的内容 现有元素和/或添加新元素。
var array = [2, 5, 9];
var index = array.indexOf(5);
if (index > -1) {
array.splice(index, 1);
}
// array = [2, 9]
第二个参数 splice
是要删除的元素数。注意 splice
修改数组并返回一个包含已删除元素的新数组。
注意: 浏览器支持indexOf 是有限的
我不知道你的期望 array.remove(int)
表现。我可以想到你可能想要的三种可能性。
在索引处删除数组的元素 i
:
array.splice(i, 1);
如果要删除每个具有值的元素 number
从数组:
for(var i = array.length - 1; i >= 0; i--) {
if(array[i] === number) {
array.splice(i, 1);
}
}
如果你只想在索引处创建元素 i
不再存在,但您不希望其他元素的索引发生更改:
delete array[i];
在这个代码示例中我使用 “array.filter(......)” 函数从数组中删除不需要的项目,此函数不会更改原始数组并创建一个新数组。如果您的浏览器不支持此功能(例如版本9之前的IE或版本1.5之前的Firefox),请考虑使用 来自Mozilla的过滤器polyfill。
var value = 3
var arr = [1, 2, 3, 4, 5, 3]
arr = arr.filter(function(item) {
return item !== value
})
console.log(arr)
// [ 1, 2, 4, 5 ]
let value = 3
let arr = [1, 2, 3, 4, 5, 3]
arr = arr.filter(item => item !== value)
console.log(arr)
// [ 1, 2, 4, 5 ]
重要 ES2015“()=> {}”IE中根本不支持箭头功能语法,Chrome版本为45版本,Firefox版本为22版本,Safari版本为10版本。要在旧浏览器中使用ES2015语法,您可以使用 BabelJS
此方法的另一个优点是您可以删除多个项目
let forDeletion = [2, 3, 5]
let arr = [1, 2, 3, 4, 5, 3]
arr = arr.filter(item => !forDeletion.includes(item))
// !!! Read below about array.includes(...) support !!!
console.log(arr)
// [ 1, 4 ]
重要 IE中根本不支持“array.includes(...)”功能,47版本之前的Chrome版本,43版本之前的Firefox版本,9版本之前的Safari版本以及14版本之前的Edge版本 这是来自Mozilla的polyfill
// array-lib.js
export function remove(...forDeletion) {
return this.filter(item => !forDeletion.includes(item))
}
// main.js
import { remove } from './array-lib.js'
let arr = [1, 2, 3, 4, 5, 3]
// :: This-Binding Syntax Proposal
// using "remove" function as "virtual method"
// without extending Array.prototype
arr = arr::remove(2, 3, 5)
console.log(arr)
// [ 1, 4 ]
参考
取决于你是否想留空。
如果你想要一个空插槽,删除就可以了:
delete array[ index ];
如果你不这样做,你应该使用 拼接 方法:
array.splice( index, 1 );
如果你需要该项的值,你可以只存储返回的数组的元素:
var value = array.splice( index, 1 )[0];
如果您想按某种顺序进行,可以使用 array.pop()
对于最后一个或 array.shift()
对于第一个(并且都返回项目的值)。
如果你不知道项目的索引,你可以使用 array.indexOf( item )
得到它(在一个 if()
获得一个项目或一个 while()
得到所有这些)。 array.indexOf( item )
如果未找到,则返回索引或-1。
一位朋友遇到了问题 Internet Explorer 8中,并告诉我他做了什么。我告诉他这是错的,他告诉我他在这里得到了答案。当前的最佳答案不适用于所有浏览器(例如Internet Explorer 8),它只会删除第一次出现的项目。
function remove(arr, item) {
for (var i = arr.length; i--;) {
if (arr[i] === item) {
arr.splice(i, 1);
}
}
}
它向后循环遍历数组(因为索引和长度将随着项目的移除而改变)并删除项目(如果已找到)。它适用于所有浏览器。
有两种主要方法:
拼接(): anArray.splice(index, 1);
删除: delete anArray[index];
对数组使用delete时要小心。删除对象的属性很好,但对数组不太好。最好使用 splice
对于数组。
请记住,当你使用时 delete
对于数组,你可能会得到错误的结果 anArray.length
。换一种说法, delete
会删除元素但不会更新length属性的值。
使用删除后,您还可能会在索引号中出现漏洞,例如:你可能最终得到索引1,3,4,8,9,11和使用删除之前的长度。
在那种情况下,所有索引 for
循环会崩溃,因为索引不再是顺序的。
如果你被迫使用 delete
出于某种原因,那么你应该使用 for each
需要循环遍历数组时循环。事实上,如果可能的话,总是避免使用索引for循环。这样,代码将更加健壮,并且不易出现索引问题。
Array.prototype.remByVal = function(val) {
for (var i = 0; i < this.length; i++) {
if (this[i] === val) {
this.splice(i, 1);
i--;
}
}
return this;
}
//Call like
[1, 2, 3, 4].remByVal(3);
Array.prototype.remByVal = function(val) {
for (var i = 0; i < this.length; i++) {
if (this[i] === val) {
this.splice(i, 1);
i--;
}
}
return this;
}
var rooms = ['hello', 'something']
rooms = rooms.remByVal('hello')
console.log(rooms)
没有必要使用 indexOf
要么 splice
。但是,如果您只想删除一个元素,它会表现得更好。
查找并移动(移动):
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;
}
使用 indexOf
和 splice
(指数):
function indexof(arr, val) {
var i;
while ((i = arr.indexOf(val)) != -1) {
arr.splice(i, 1);
}
}
仅限使用 splice
(拼接):
function splice(arr, val) {
for (var i = arr.length; i--;) {
if (arr[i] === val) {
arr.splice(i, 1);
}
}
}
nodejs上运行时间为1000个元素(平均超过10000次运行)的数组:
指数 大约慢10倍 移动。即使通过删除呼叫改进 indexOf
在 拼接 它表现得比 移动。
Remove all occurrences:
move 0.0048 ms
indexof 0.0463 ms
splice 0.0359 ms
Remove first occurrence:
move_one 0.0041 ms
indexof_one 0.0021 ms