JScript内置对象Array中元素的删除问题

JScript内置对象Array中元素的删除问题

    我们知道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.gif
Array.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以下就可以了。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111169.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • linux查看全部环境变量_centos7环境变量配置

    linux查看全部环境变量_centos7环境变量配置一、查看环境变量 $env二、查看PATH $echo$PATH三、修改PATH 在Linux里设置环境变量的方法(exportPATH)一般来说,配置交叉编译工具链的时候需要指定编译工具的路径,此时就需要设置环境变量。例如我的mips-linux-gcc编译器在“/opt/au1200_rm/build_tools/bin”目录下,build_tools就是

    2022年10月1日
    0
  • 10秒钟脱口而出十位数相同两位数的乘法

    10秒钟脱口而出十位数相同两位数的乘法10秒钟脱口而出十位数相同两位数的乘法一、范围十位数相同的两位数。二、目标计算两位数的相乘。10秒钟脱口而出。三、基本公式以尾数之和展开讨论:假设两个数分别是10a+b以及10a+c,那么尾数之和就是b+c。序号分类公式举例1尾数之和小于10即b+c(10a+b)(10a+c)=100a²+10a(b+c)+bc=10a((10a+b)+c)+bc  21X23=(20+1)(20+

    2022年6月4日
    56
  • MySQL——日期函数,时间函数

    MySQL——日期函数,时间函数

    2021年5月20日
    143
  • 深度相机种类_深度相机原理

    深度相机种类_深度相机原理本文首发于微信公众号:计算机视觉life。本文的深度相机制造商涉及:Microsoft、Intel、LeapMotion、Orbbec、图漾、OccipitalStructure、Stereolabs、DUO。文末附深度相机详细对比清单。MicrosoftKinect微软推出了两款Kinect,Kinect一代(Kinectv1)是基于结构光原理的深度相机,Kinect二代(Kine

    2022年10月30日
    0
  • word目录链接无法跳转_怎样跳转网页

    word目录链接无法跳转_怎样跳转网页概述目前使用的next版本是5.1.4,文章左侧的目录一直不能跳转也不能展开,按网上的办法一直没法解决,今天自己琢磨了一阵总算搞定了。由于发现遇到这个问题的人不少,特此总结一下。一般分为

    2022年8月16日
    13
  • 关于ASIC、CPLD和FPGA介绍

    关于ASIC、CPLD和FPGA介绍关于ASIC、CPLD和FPGA介绍ASIC(ApplicationSpecificIntergratedCircuits)即专用集成电路,是指应特定用户要求和特定电子系统的需要而设计、制造的集成电路。目前用CPLD(复杂可编程逻辑器件)和FPGA(现场可编程逻辑阵列)来进行ASIC设计是最为流行的方式之一,它们的共性是都具有用户现场可编程特性,都支持边界扫描技术,但两者在集成度、速

    2022年5月4日
    60

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号