我是FE,也是Fe

前端来源于不断的点滴积累。我一直在努力。

统计

留言簿(15)

阅读排行榜

评论排行榜

怎样高效的批量删除javascript 数组中的元素?

通常我们需要删除数据中特定元素,这个我个人比较喜欢用Array.splice(beginIndex,deleteCount,[,itemToAdd,..])。这个方法的第一个参数是在哪个下标元素开始操作。第二个参数是需要删除的元素的个数。后面的参数任意个,是需要在beginIndex出添加的元素。

如果要批量删除数组元素的话,可得注意一个地方了。先看看下面的例子:

var arr =["a","b","c","d","e","f"];
        
//本来想删除 e f 
        arr.splice(4,1);
        arr.splice(
5,1);//这时候数组长度是5。想删除第六个元素当然是不可能的
        alert(arr);//a,b,c,d,e             f 没有删掉

也就是在批量删除的时候,其实数组长度也在发生变化。几番调试纠结之后,发现如果从一个数组元素的后面删除到前面,这样不管长度怎么变化都没有关系了 。

var arr =["a","b","c","d","e","f"];
        
var toDeleteIndexes= [5,3,1];
        
for (var i=0;i<toDeleteIndexes.length ; i++){
            arr.splice(toDeleteIndexes[i],
1);
        }
        alert(arr);
//a,c,e works

事实上上面的toDeleteIndexes并不是规规矩矩的排序的,于是首先想到是不是可以先将toDeleteIndexes排序了?下面是方法一

function removeBatch2(arr,toDeleteIndexes){
            toDeleteIndexes.sort();
//按大到小排列
            for (var i=toDeleteIndexes.length-1 ;i>=0; i--){
                arr.splice(toDeleteIndexes[i],
1);
            }
            
return arr;
        }

        
var arr =["a","b","c","d","e","f"];

        
var toDeleteIndexes= [5,1,3];

        
//删除a数组中下表为5,1,3的数组
        alert(removeBatch2(arr,toDeleteIndexes));

上面的函数能批量删除元素,下面这种方法(方法二)也可行:
//批量删除指定下标的数据元素
        function removeBatch(arr,toDeleteIndexes){
            
var result=[];
            
for (var i=0;i<arr.length ; i++){
                
var o  = arr[i];
                
var needDelete = false;
                
for (var j=0;j<toDeleteIndexes.length ; j++){
                    
if(i==toDeleteIndexes[j]){needDelete=true; break;}
                }
                
if(!needDelete){
                    result.push(arr[i]);
                }
            }
            
return result;
        }

        
var arr =["a","b","c","d","e","f"];

        
var toDeleteIndexes= [5,1,3];

        
//删除a数组中下表为5,1,3的数组
        alert(removeBatch(arr,toDeleteIndexes));

这种方法是一种典型的用空间复杂度换取时间复杂度。这两种方法究竟孰优孰劣,可以简单的计算一下循环次数。(n代表arr长度,m代表toDeleteIndexes长度)

方法一的运算次数:通常sort最多是n*(n-1)/2 次。后面循环了m*( n*(n-1)/2)。splice应该也循环了begin次数。所以总的运算次数应该是(m+1)*n*(n-1)/2次
方法二的运算次数:n*m/2   for (var j=0;j<toDeleteIndexes.length ; j++){if(i==toDeleteIndexes[j]){needDelete=true; break;} 算m/2次。

方法二需要重新申明一个数组,占内存应该会大些。

关于算法方面的结论,都是估算,还请读者指点。

总的来说,对于有确定的排序下标的批量删除,速度是最快的,不需要对下标排序。大家有更好的方法,欢迎交流。

posted on 2010-12-29 15:58 衡锋 阅读(3025) 评论(4)  编辑  收藏 所属分类: javascriptWeb开发

评论

# re: 怎样高效的批量删除javascript 数组中的元素? 2010-12-29 22:47 红肠

正在研究网站,觉得这篇文章挺有用的啊  回复  更多评论   

# re: 怎样高效的批量删除javascript 数组中的元素? 2010-12-30 11:46 HiMagic!

第二种开新数组的方式不太好,其实就用倒查,要么事先sort,要么循环内检查  回复  更多评论   

# re: 怎样高效的批量删除javascript 数组中的元素?[未登录] 2011-01-04 20:19 stanleyxu2005

调用几次array.slice()创建一个新的copy会比较有效率。  回复  更多评论   

# re: 怎样高效的批量删除javascript 数组中的元素? 2011-09-16 08:29 tbw

楼主的 javascript 好强大啊   回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航: