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

    主站蜘蛛池模板: 国产精品亚洲玖玖玖在线观看 | 久久国产乱子伦免费精品| 亚洲国产综合自在线另类| 亚洲成人国产精品| 国产亚洲真人做受在线观看| 四虎国产精品免费久久| 最新国产乱人伦偷精品免费网站| 日韩精品免费电影| 免费福利网站在线观看| 亚洲人成网站日本片| 亚洲第一成年男人的天堂| 久操免费在线观看| 男女拍拍拍免费视频网站| 特级无码毛片免费视频| 免费无码午夜福利片| 羞羞视频在线免费观看| 美美女高清毛片视频黄的一免费| 亚洲久热无码av中文字幕| 亚洲AV无码专区日韩| 亚洲成人国产精品| 亚洲精品无码AV人在线播放| 亚洲人成在线播放网站| 一色屋成人免费精品网站 | 亚洲精品第五页中文字幕 | 亚洲国产成人AV在线播放| 亚洲精品无码不卡在线播放| 亚洲欧洲日本在线观看| 在线精品自拍亚洲第一区| 婷婷亚洲久悠悠色悠在线播放 | 免费国产黄网站在线观看视频| 亚洲中文字幕久久精品无码VA| 亚洲gay片在线gv网站| 久久成人永久免费播放| 国产精品视频免费观看| 中文精品人人永久免费| 在线视频免费观看高清| 日韩精品成人亚洲专区| 久久精品国产亚洲AV香蕉| 亚洲黄片手机免费观看| 免费人成视频在线观看视频| 国产亚洲精品a在线无码|