<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我是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 衡鋒 閱讀(3042) 評論(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 好強大啊   回復  更多評論   

    主站蜘蛛池模板: 51视频精品全部免费最新| 男人和女人高潮免费网站| 国产精品免费大片| 中文字幕精品亚洲无线码一区| 黑人粗长大战亚洲女2021国产精品成人免费视频 | 四虎在线免费视频| 久久亚洲AV成人无码软件| 老汉精品免费AV在线播放| 久久精品国产亚洲AV嫖农村妇女| 中文字幕免费在线| 亚洲精品中文字幕无码AV| 国产又大又粗又长免费视频| 亚洲一区二区三区精品视频 | 破了亲妺妺的处免费视频国产| 亚洲国产精品自在自线观看| 四虎www免费人成| 亚洲AV女人18毛片水真多| 免费国产a国产片高清| 成年大片免费高清在线看黄| 亚洲乱亚洲乱妇无码麻豆| 好紧我太爽了视频免费国产| 一区二区三区亚洲| 美女网站免费福利视频| 日本亚洲欧美色视频在线播放| 亚洲国产人成中文幕一级二级| jizz免费在线影视观看网站| 国产亚洲人成网站在线观看不卡| 91大神免费观看| 亚洲精品动漫免费二区| 中文字幕在亚洲第一在线| 一级毛片免费不卡在线| 亚洲欧美日韩中文字幕在线一区| 免费A级毛片无码久久版| a级毛片免费全部播放无码| 亚洲成人福利网站| 免费国产在线观看不卡| 国产精品免费看久久久| 久久精品亚洲日本波多野结衣| 亚洲毛片αv无线播放一区| 成人午夜大片免费7777| 丝瓜app免费下载网址进入ios|