js 数组删除元素分析

来源:互联网 发布:服务器软件巡检 编辑:程序博客网 时间:2024/04/29 19:19

一. 引子

今天遇到个问题,如何在遍历数组的同时动态地删除元素。接下来我将试图从遍历和删除两个方面做出代码解释并最终分析效率问题。

二. 遍历数组

先来看看示例数组。
[javascript] view plaincopy
  1. var a1 = [];  
  2. a1[1] = 'aa';  
  3. a1[5] = 'bb';  
  4. console.log(a1.length);//6  

方式一,用6次循环遍历 a1 中仅有的两个数据,四次输出
[javascript] view plaincopy
  1. <pre name="code" class="javascript">var l1 = a1.length;  
  2. for(var i = 0; i < l1; i++)  
  3. {  
  4.     console.log('a1[' + i + ']=' + a1[i]);  
  5. }</pre>  
  6. <pre></pre>  
  7. <div>输出</div>  
  8. <div><pre name="code" class="javascript">a1[0]=undefined  
  9. a1[1]=aa  
  10. a1[2]=undefined  
  11. a1[3]=undefined  
  12. a1[4]=undefined  
  13. a1[5]=bb</pre><br>  
  14. <br>  
  15. </div>  
  16. 方式二  
  17. <pre></pre>  
[javascript] view plaincopy
  1. var k = -1;  
  2. for(k in a1)  
  3. {  
  4. <span style="white-space:pre">  </span>console.log('a1['+ k + "]=" + a1[k]);  
  5. }  

输出
[javascript] view plaincopy
  1. <pre name="code" class="javascript">a1[1]=aa  
  2. a1[5]=bb</pre><br>  
  3. <pre></pre>  
  4. <h1><a name="t2"></a>三. 删除元素</h1>  
  5. <pre></pre>  

方式一. 使用splice函数

对于表达式 a1.splice(1,1) ,后面的 1 表示 删除 a1 的一个元素,前面的 1 表示从下标为 1 的地方开始删,被删除的元素后面的元素的下标都会相应地减一。可以想见,执行 a1.splice(1,5)会导致 a1[1] 和 a1[5] 都被删除掉。
[javascript] view plaincopy
  1. var a2 = a1.splice(1,1);  
  2. for(k in a1)  
  3. {  
  4.     console.log('a1['+ k + "]=" + a1[k]);  
  5. }  
输出
[javascript] view plaincopy
  1. a1[4]=bb  
注意到原来是 a1[5] = bb 现在,下标减小了,这也许不是你想要的。

而 a2 中存放的是被删除的元素构成的数组,下标从 0 开始
[javascript] view plaincopy
  1. a2[0]=aa  

使用 splice 的缺陷据说是 IE5.5 不支持,暂时就不查证了。

方式二. 配合使用 slice 和 concat 函数

网络上有种做法, 自定义原型函数 Array.prototype.del ,修改 Array 原型的做法,不可取。一方面,修改 JS 原生类型的 原型本身就应该避免;另一方面,我发现,这么做会影响使用 for in 遍历数组的结果。例如:
[javascript] view plaincopy
  1. var a3 = [1,2];  
  2. Array.prototype.someFunc = function(){  
  3. <span style="white-space:pre">  </span>//some commands  
  4. <span style="white-space:pre">  </span>return ;  
  5. };  
  6. for(var k in a3)  
  7. {  
  8. <span style="white-space:pre">  </span>console.log('a3[' + k + ']='+ a3[k]);  
  9. }  

输出

[javascript] view plaincopy
  1. <pre name="code" class="javascript">a3[0]=1  
  2. a3[1]=2  
  3. a3[someFunc]=function (){  
  4.     //some commands  
  5.     return ;  
  6. }</pre><br>  
  7. <pre></pre>  
  8. 这不是我们想要的结果。  
  9. <pre></pre>  
所以,最终给出的方法是这样的:
[javascript] view plaincopy
  1. function delEle(aIn,iIdx)  
  2. {  
  3.     if(! Array.prototype.isPrototypeOf(aIn)){  
  4.         return null;//根据Null可以判断本次调用失败  
  5.     }  
  6.     var iIdx = parseInt(iIdx),  
  7.         iLen = iIdx.length;  
  8.     if(iIdx < 0 || iIdx >= iLen){  
  9.         return null;//根据Null可以判断本次调用失败  
  10.     }  
  11.     var aRet = [];//与NULL不同  
  12.     return aRet=aIn.slice(0,iIdx).concat(aIn.slice(iIdx+1));  
  13. }  


四.在遍历的过程中选择性删除

我的做法是,把要删除的元素设置为 undefined ,遍历完了之后再过滤出非 undefined 的元素,拼成新的数组。
0 0
原创粉丝点击