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

          主站蜘蛛池模板: 保山市| 突泉县| 中牟县| 西华县| 延川县| 万源市| 康平县| 新安县| 芜湖市| 十堰市| 鹤庆县| 天水市| 襄城县| 确山县| 五华县| 筠连县| 新平| 巍山| 武胜县| 弋阳县| 孝义市| 轮台县| 崇文区| 革吉县| 曲水县| 桂阳县| 湖州市| 阿巴嘎旗| 什邡市| 涡阳县| 灵丘县| 潮安县| 宁夏| 仲巴县| 日照市| 靖边县| 博乐市| 公主岭市| 沂南县| 泰安市| 如皋市|