【问题标题】:javascript array.splice() does not remove element in the array?javascript array.splice() 不会删除数组中的元素?
【发布时间】:2012-03-12 22:43:43
【问题描述】:

我有一个 remove[] 数组,其中包含数据数组中所有元素的所有索引位置(如下所示)。

数据数组:

Retail,1,Utilities,1,Food & Restaurant,3,No Data,4,Construction,0,Non-profit,1,Financial Services,12,Technology,2,Law,3,Religion,3,Retired,2,Insurance,0,Real Estate,2,Audit,3,Business Organizations,3,Media & Marketing,0,Education,3,Transportation,0,Manufacturing,0,Entertainment & Sports,0,Architecture & Engineering,0,Cultural Institutions,0,Government,0,Banking,0,Health Care,0,Business Services,0

我的 javascript

   var remove =  [];          
    $.each(options.series[0].data, function(index, item) {
    if (options.series[0].data[index][1] == 0)
    {                    
        //options.series[0].data.splice(index,1);  
        remove[index] = index;                                      

    }

    for (i=0; i<=remove.length; i++)
    {
    //alert(remove);                
    if (remove[i] != undefined)
        options.series[0].data.splice(remove[i],1);

    }   

splice() 之后的数据数组。很多带0的元素还在。

Retail,1,Utilities,1,Food & Restaurant,3,No Data,4,Non-profit,1,Financial Services,12,Technology,2,Law,3,Religion,3,Retired,2,Insurance,0,Audit,3,Business Organizations,3,Media & Marketing,0,Education,3,Manufacturing,0,Entertainment & Sports,0,Cultural Institutions,0,Banking,0,Business Services,0

如果我更改了拼接以包含替换元素

options.series[0].data.splice(remove[i],1,'removed');

从数据数组中删除所有 0 元素。嗯?

Retail,1,Utilities,1,Food & Restaurant,3,No Data,4,removed,Non-profit,1,Financial Services,12,Technology,2,Law,3,Religion,3,Retired,2,removed,Real Estate,2,Audit,3,Business Organizations,3,removed,Education,3,removed,removed,removed,removed,removed,removed,removed,removed,removed

如何删除数据数组中的所有 0 元素?

【问题讨论】:

  • 看起来数组的成员应该是字符串。你没有引用它们,所以它们被解释为标识符,你应该得到错误 - 除非你没有发布真正的代码。

标签: javascript jquery


【解决方案1】:

每次删除一个时,都会使任何进一步的缓存索引过时,因为从那时起的数组被重新索引。

因此,您在第一个之后删除了错误的项目。

您应该反向迭代 remove 数组。

var i = remove.length;
while (i--) {
    if (remove[i] != undefined)
        options.series[0].data.splice(remove[i],1);
}   

此外,如果您只需将.push() 每个索引放入remove 数组中,您就可以提高性能并摆脱undefined 测试...

remove.push(index);

【讨论】:

  • 它也应该向前工作如果存在一对一的交换,因为插入的元素替换了删除的元素,索引不受影响。否则,是的,应该倒着做。
  • @RobG:插入的元素是工作代码的一部分。 OP 表示进行插入可以解决问题,但不需要插入。编辑:看到你的更新......是的,只要有插入,它就会起作用。
  • 优秀。这样可行。我还想知道如何摆脱 remove[] 中未定义的值。你读懂了我的想法并回答了:)。
  • @EverydayImSeeSharping:很高兴它成功了。 :) 仅供参考,除非您对 remove 数组有其他用途,否则您始终可以直接反向迭代 options.series[0].data 数组,然后在此处执行 splice()
  • @amNot——打字时的一些干扰。 :-)
【解决方案2】:

我的问题是 splice 从数组中删除了错误的元素。我看到了 while 循环的答案,但我提出的解决方案是:

var index = jQuery.inArray(element, arr);
arr.splice(index,1);

【讨论】:

    【解决方案3】:

    如果您查看原始数组和第一个结果数组,您会注意到非 0 元素正在被删除。据我所知,问题是您的数组remove 正在寻找那些在删除以前的索引后已经向左移动的索引。您需要在最终的 for 循环中为此添加一个更正调整,或以其他方式处理。

    【讨论】:

      【解决方案4】:

      如果要删除数组中的所有元素,最好不要使用splice,而是使用length

      options.series[0].data.length = 0;
      

      见:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/length

      更新:

      我误解了这个问题。在您的情况下,我可能会过滤掉零元素,而不是进行两个循环(一个用于收集它们,一个用于删除它们)。所以,类似:

      function isNotZero(item) {return item[1] !== 0}
      
      var filtered = options.series[0].data.filter(isNotZero);
      
      options.series[0].data = filtered;
      

      见:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/filter

      如果您要支持的浏览器没有实现 ES5,我会建议您为所有 es5 方法使用 shim(在该页面中有一个用于过滤器),或者像 underscore 这样的库

      【讨论】:

      • 并非所有元素都被删除。 OP 正在构建具有值 0 的元素的索引列表,并且只删除那些。
      【解决方案5】:

      我认为您可以通过这种方式快速完成:

      var dataArr = ["Retail",1,"Utilities",1,"Food & Restaurant",3,"No Data",4,"Construction",0,"Non-profit",1,"Financial Services",12,"Technology",2,"Law",3,"Religion",3,"Retired",2,"Insurance",0,"Real Estate",2,"Audit",3,"Business Organizations",3,"Media & Marketing",0,"Education",3,"Transportation",0,"Manufacturing",0,"Entertainment & Sports",0,"Architecture & Engineering",0,"Cultural Institutions",0,"Government",0,"Banking",0,"Health Care",0,"Business Services",0];
      
      var item = 0; // value of the item to remove
      
      while (dataArr.indexOf(item) > -1) {
       dataArr.splice(dataArr.indexOf(item), 1);
      }
      
      console.log(dataArr);
      

      【讨论】:

        【解决方案6】:

        我使用了一个名为 DevBox.Linq.JS 的库

        它基本上将 Linq 类型功能添加到 Javascript 数组。例如,它添加了“删除”:

           Array.prototype.Remove = function (condition) {
            if (condition == undefined) {
                console.error('Informe a expressão para executar a tarefa.')
                return;
            }
        
            for (var i = 0 ; i < this.length ; i++) {
                if (condition(this[i]))
                    this.splice(i, 1);
            }
        }
        

        这样你就可以将它与这样的 lambda 一起使用:

        myArray.remove(i=>i=="valueToDelete");
        

        希望对您有所帮助,它已经具备所有功能,因此您不必处理讨厌的拼接。

        【讨论】:

          猜你喜欢
          • 2018-05-05
          • 2014-05-22
          • 1970-01-01
          • 1970-01-01
          • 2022-12-26
          • 1970-01-01
          • 1970-01-01
          • 2010-10-04
          • 1970-01-01
          相关资源
          最近更新 更多