怎样高效的批量删除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次。

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值