JavaScript数组搜索并删除字符串?


132

我有:

var array = new Array();
array.push("A");
array.push("B");
array.push("C");

我希望能够执行以下操作:

array.remove("B");

但没有删除功能。我该如何完成?


5
的组合.indexOf().splice()应该做的伎俩。或者,也许是.filter()
Marc B


Answers:


184

我实际上正在使用一个较新的1行解决方案更新此线程:

let arr = ['A', 'B', 'C'];
arr = arr.filter(e => e !== 'B'); // will return ['A', 'C']

这个想法基本上是通过选择与要删除的元素不同的所有元素来过滤数组。

注意:将删除所有出现的事件。

编辑:

如果只想删除第一次出现的情况:

t = ['A', 'B', 'C', 'B'];
t.splice(t.indexOf('B'), 1); // will return ['B'] and t is now equal to ['A', 'C', 'B']

1
此解决方案返回数组的副本,而使用splice可以删除元素。您选择哪种取决于上下文。
twhitehead

6
这对于需要返回新状态的Redux东西是完美的。
colinwong

@Regis实际上不是,arr.filter返回一个新数组。因此arr.filter(e => e!=='B')不会修改arr。也许我不正确理解您的评论?
Tyrannas '18

有没有一种方法可以在首次发生时停止?所以如果有5个'B'可以删除一个?
阿里(Ari)

1
@Ari我已经更新了删除仅一个元素的答案
Tyrannas '19

171

以相反的顺序循环浏览列表,然后使用.splice方法。

var array = ['A', 'B', 'C']; // Test
var search_term = 'B';

for (var i=array.length-1; i>=0; i--) {
    if (array[i] === search_term) {
        array.splice(i, 1);
        // break;       //<-- Uncomment  if only the first term has to be removed
    }
}

当必须删除所有出现的搜索词时,逆序很重要。否则,计数器将增加,并且您将跳过元素。

当只需要删除第一次出现时,以下操作也将起作用:

var index = array.indexOf(search_term);    // <-- Not supported in <IE9
if (index !== -1) {
    array.splice(index, 1);
}

1
我在猜测,因为它的意思是反向迭代要快一些。
本·克莱顿

1
@BenClayton:谢谢。在JavaScript中,FWIW并非完全正确。倒数0不会自动像C那样更快。当然,只要您缓存了限制,如果您继续追逐第一个比赛,这会使事情复杂化(但如果停在那,则不会这样)。
TJ Crowder 2012年

如果我们要追求速度,为什么不使用while-?:D
Snuffleupagus

11
这与速度无关,他甚至在回答中说。关于跳过元素。如果您在位置5并拼接该位置,那么位于位置6的熔铸元素现在位于5。尽管如此,您的循环计数器仍在增加,下一个迭代是在位置6处进行的,因此您跳过了该项目。这就是为什么它的顺序相反。
amenthes

1
如果在正向循环中删除项目,并且某个项目被删除,则最后一次迭代可能会引发空指针异常,因为它将引用不存在的索引
Drenai

23

一线清单

让我们为这个数组解决这个问题:

var array = ['A', 'B', 'C'];

1.仅删除第一个: 使用如果您确定该项存在,请使用

array.splice(array.indexOf('B'), 1);

2.仅删除最后一个: 用途如果您确定该项目存在

array.splice(array.lastIndexOf('B'), 1);

3.删除所有出现的事件:

array = array.filter(v => v !== 'B'); 

21

演示

您需要找到要查找的内容的位置,.indexOf()然后使用将其删除.splice()

function remove(arr, what) {
    var found = arr.indexOf(what);

    while (found !== -1) {
        arr.splice(found, 1);
        found = arr.indexOf(what);
    }
}

var array = new Array();
array.push("A");
array.push("B");
array.push("C");
    
remove(array, 'B');
alert(array)​​​​;

这将解决所有情况。


对于不支持的浏览器.indexOf(),你可以添加对您的JavaScript文件。
qwertymk 2012年

是的,优雅。如果您需要一个选项来仅删除一些元素,例如仅删除第一个元素:则更新相同:jsfiddle.net/qpZFd/9
sebilasse

我总是收到以下错误:Uncaught ReferenceError: array is not defined。怎么了?
Pathros

如果您要走这条路线,则可以轻松利用.indexOf()更多功能。如果您在while循环内found将第二个参数传递给.indexOf()调用,则不会再次检查数组中已检查并最终不相等的元素: found = arr.indexOf(what, found);
pimmhogeling

14

只是

array.splice(array.indexOf(item), 1);

是的,除了indexOf将-1在没有发现任何东西的情况下返回并且哎呀,拼接将从数组末尾删除1个元素
Ricky Spanish


1

您必须编写自己的删除。您可以遍历数组,获取要删除的项目的索引,然后使用splice它来删除它。

或者,您可以创建一个新数组,在当前数组上循环,如果当前对象与您要删除的对象不匹配,则将其放入新数组中。



1
const changedArray = array.filter( function(value) {
  return value !== 'B'
});

或者您可以使用:

const changedArray = array.filter( (value) => value === 'B');

changedArray将包含无值“ B”


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.