博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JScript内置对象Array中元素的删除问题
阅读量:6594 次
发布时间:2019-06-24

本文共 1218 字,大约阅读时间需要 4 分钟。

  我们知道JScript给我们提供了一个内置的数组对象Array。Array对象除了提供了constructor、length和prototype外,还默认提供了13个方法:concat、join、pop、push、reverse、shift、slice、sort、splice、toLocaleString、toString 、unshift和valueOf,可是没有提供delete方法emsad.gif

    要是熟悉JavaScript的话,会马上说,系统提供了一个delete操作,可以用来删除数组中的元素。对,JS系统里确实有一个delete可以删除数组中的元素。可是这个删除很难用,它确实可以删除元素,可是它却不更新Array对象的元素计数器。例如我们执行:

None.gif
var ary = ['a', 'b', 'c'];
None.gif
delete ary[1];

    如果正确的执行删除后,我们希望会得到一个新的数组,他有两个元素['a', 'c'],长度为2。可是执行完后我们确实是得到了两个元素['a', 'c']的数组,可是这个新数组的长度ary.length居然还是3!hitwall.gif。同时我们执行ary.toString()将得到"a,,c",这也表明数组的计数器还是3,因为Array的toString()实际上执行的是Array.join(',')。

    这样的删除在我们使用for( ; ; )遍历数组的时候,将会非常的郁闷,我们可能很容易就可能被一个undefined的值搞死掉了。那么怎么才能获得删除数组元素后同步数组的大小呢?由于Array本身提供的pop和shift两个函数可以"真正的"删除数组的元素,所以我们可以使用它们来自己扩充一个remove函数。

    但是pop和shift只能从数组的两端删掉元素,所以我们在删除之前需要对数组做一些整理,实现remove方法的代码如下:

None.gifArray.prototype.remove = 
function(obj)
None.gif{
None.gif    
for ( 
var i=0 ; i < 
this.length ; ++i )
None.gif    {
None.gif        
if ( 
this[i] == obj )
None.gif        {
None.gif            
if ( i > 
this.length/2 )
None.gif            {
None.gif                
for ( 
var j=i ; j < 
this.length-1 ; ++j )
None.gif                {
None.gif                    
this[j] = 
this[j+1];
None.gif                }
None.gif                
this.pop();
None.gif            }
None.gif            
else
None.gif            {
None.gif                
for ( 
var j=i ; j > 0 ; --j )
None.gif                {
None.gif                    
this[j] = 
this[j-1];
None.gif                }
None.gif                
this.shift();
None.gif            }    
None.gif            
break;
None.gif        }
None.gif    }
None.gif};

    移动整理数组的目的只是为了删除元素后不改变剩余元素的彼此相对位置,否则只用把需要删除的元素swap到两端pop或shift以下就可以了。

本文转自博客园鸟食轩的博客,原文链接:http://www.cnblogs.com/birdshome/,如需转载请自行联系原博主。

你可能感兴趣的文章
Linux/Unix的精巧约定两例及其简析:目录权限和文本行数
查看>>
WebDAV助手1.1.0更新
查看>>
观察者模式
查看>>
HDU Problem 1159 Common Subsequence 【LCS】
查看>>
[CTSC2018]青蕈领主
查看>>
原型继承
查看>>
找不到ifconfig命令
查看>>
微服务事务处理
查看>>
用Groovy进行单元测试
查看>>
github地址
查看>>
nginx使用
查看>>
两个openssh间免密码登录
查看>>
【linux】 linux gpio操作
查看>>
【linux kernel】 softirq 软中断讨论
查看>>
2019武汉大学数学专业考研真题(回忆版)
查看>>
百度地图车辆运动轨迹
查看>>
RE模块错误已解决.
查看>>
ant使用指南详细入门教程
查看>>
文本与字体
查看>>
汕头市队赛 yyl杯1 T1
查看>>