【问题标题】:Javascript array search and remove string?Javascript数组搜索和删除字符串?
【发布时间】:2022-04-28 17:24:35
【问题描述】:

我有:

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

我希望能够做类似的事情:

array.remove("B");

但没有删除功能。我该如何做到这一点?

【问题讨论】:

标签: javascript arrays


【解决方案1】:

我实际上正在使用更新的 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']

【讨论】:

  • 此解决方案返回数组的副本,而使用 splice 会删除适当的元素。您选择哪个取决于上下文。
  • 这非常适合需要返回新状态的 Redux 内容。
  • @Regis 其实不是,arr.filter 返回一个新数组。所以 arr.filter(e => e!== 'B') 不会修改 arr。或者我没有正确理解您的评论?
  • 有没有办法做到这一点,但在第一次出现时停止?所以如果有 5 个 B 只删除一个?
  • @Ari 我已经更新了只删除一个元素的答案
【解决方案2】:

以相反的顺序遍历列表,并使用.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);
}

【讨论】:

  • 我猜是因为反向迭代会稍微快一点。
  • @BenClayton:谢谢。 FWIW,在 JavaScript 中,这并不可靠。倒计时到0 并不会像在 C 中那样自动更快。当然,只要您缓存限制,如果您在第一场比赛后继续前进,这会使事情变得复杂(但如果您停止它)。
  • 如果我们追求速度,为什么不使用 while --? :D
  • 这与速度无关,他甚至在回答中这么说。这是关于跳过元素。如果您在位置 5 并拼接该位置,则位于位置 6 的元素formelry 现在位于 5。尽管如此,你的循环计数器会增加,下一次迭代是位置 6,那是你跳过一个项目的地方。这就是为什么它的顺序相反。
  • 如果您在前向循环中删除项目,并且项目被删除,最后一次迭代可能会抛出空指针异常,因为它将引用一个不存在的索引
【解决方案3】:

一个班轮列表

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

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'); 

【讨论】:

    【解决方案4】:

    DEMO

    您需要使用.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()的浏览器,您可以将this添加到您的javascript文件中。
    • 是的,优雅。如果您需要一个选项来仅删除某些元素,例如只有第一个:相同的更新:jsfiddle.net/qpZFd/9
    • 我总是收到以下错误:Uncaught ReferenceError: array is not defined。怎么了?
    • 如果您要走这条路,您可以轻松地利用.indexOf() 多一点。如果您将found 作为第二个参数传递给.indexOf() 调用在while 循环内,则不会再次检查数组中已经检查并最终不相等的元素:@ 987654334@
    【解决方案5】:

    简单

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

    【讨论】:

    • 是的,除了 indexOf 将返回 -1 如果没有找到任何东西,哎呀,splice 将从数组末尾删除 1 个元素
    【解决方案6】:

    简单的解决方案(ES6)

    如果您没有重复元素

    Array.prototype.remove = function(elem) {
      var indexElement = this.findIndex(el => el === elem);
      if (indexElement != -1)
        this.splice(indexElement, 1);
      return this;
    };   
    

    Online demo (fiddle)

    【讨论】:

    • 如果没有找到匹配项,此解决方案总是删除最后一个元素。
    【解决方案7】:
    const changedArray = array.filter( function(value) {
      return value !== 'B'
    });
    

    或者你可以使用:

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

    changedArray 将包含无值 'B'

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

        【解决方案9】:

        使用array.splice

        /*array.splice(index , howMany[, element1[, ...[, elementN]]])
        
        array.splice(index) // SpiderMonkey/Firefox extension*/
        
        array.splice(1,1)
        

        来源: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

        【讨论】:

        • arraysplice 之间的逗号必须是一个点。
        • 试图纠正,但 SO 的政策规定编辑必须是 6 个字符或更多:/
        【解决方案10】:

        使用:

        array.splice(2, 1);
        

        这会从数组中删除一项,从索引 2(第 3 项)开始

        【讨论】:

        【解决方案11】:

        这仅在str列表中有效,查找this

        myStrList.filter(item=> !["deletedValue","deletedValue2"].includes(item))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-29
          • 1970-01-01
          • 2013-06-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多