javascript array.splice()不会删除数组中的元素

javascript array.splice() does not remove element in the array?

本文关键字:数组 删除 元素 array splice javascript      更新时间:2023-09-26

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

数据阵列:

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元素?

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

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

您应该反向迭代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);

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

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

如果您查看原始数组和第一个结果数组,您会注意到非0元素正在被删除。据我所知,问题在于,您的数组remove正在寻找索引,这些索引在删除之前的索引后向左移动了一个。您需要在最后的for循环中添加一个校正调整,或者用另一种方法。

如果您想从数组中删除所有元素,最好不要使用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方法使用一个填充程序(在该页面中有一个用于过滤器),或者像库一样的下划线

我认为你可以用这种方式做得很快:

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

我使用一个名为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");

希望它能有所帮助,它已经具备了所有的功能,所以你不必处理那个讨厌的拼接。