真正删除数组中元素的方法
在flash中删除数组中的某一个元素有两种方法:一种是使用"delete",一种是使用数组中的方法"splice",可能还会有人使用附值的方法,如把要删的字符附为"undeined" or "null",好了,现在我们来测试一下这几种方法有什么区别:
[http://www.fanflash.cn 原创]
1.使用delete删除:
这个是我们平常删除变量时的删除方法,这种方法删除时可以把数组的某一个项给删除掉,但是他不会重新排列数组把后面的给补上来,数组的长度也不会改变.所以使用时要注意一点.因为在使用"for(var i=0;i<len;i++)"遍历数组时,无论你删除数组的多少项,无论你删除的是数组中的第一项还是最后一项,数组的长度都是保持不变,所以如果用这个方法来遍历数组,那么如"delete arr[4]",那么你遍历到arr[4]的时候他的值将是undefined,但是如你是使用"for in"来遍历数组的话,那么,使用"delete"删除的项将不会出现在枚举内,如下面程序所示:
trace("原数组");
var t:Array = [1, 2, 3, 4, 5, 6];
toArrString(t);
trace("delete删除")
delete t[4];
toArrString(t);
toArrString2(t);
/**
* 返回数组中的无素
* @author http://www.fanflash.cn
* arr:要显示出项值的数组
*/
function toArrString(arr:Array) {
var len:Number = arr.length;
trace("Array.length:"+len);
for(var i in arr){
trace("Array["+i+"]:"+arr);
}
trace("\n")
}
function toArrString2(arr:Array) {
var len:Number = arr.length;
trace("Array.length:"+len);
for(var i=0;i<len;i++){
trace("Array["+i+"]:"+arr);
}
trace("\n")
}
----------output--------------
原数组
Array.length:6
Array[5]:6
Array[4]:5
Array[3]:4
Array[2]:3
Array[1]:2
Array[0]:1
delete删除
Array.length:6
Array[5]:6
Array[3]:4
Array[2]:3
Array[1]:2
Array[0]:1
Array.length:6
Array[0]:1
Array[1]:2
Array[2]:3
Array[3]:4
Array[4]:undefined
Array[5]:6
另外delete还可以删除splice无能为力的非数值下标的数组项:
trace("原数组");
var t:Array = [1, 2, 3, 4, 5, 6];
t["www.fanflash.cn"]=123
toArrString(t);
trace("delete删除")
delete t["www.fanflash.cn"]
toArrString(t);
/**
* 返回数组中的无素
* @author http://www.fanflash.cn
* arr:要显示出项值的数组
*/
function toArrString(arr:Array) {
var len:Number = arr.length;
trace("Array.length:"+len);
for(var i in arr){
trace("Array["+i+"]:"+arr);
}
trace("\n")
}
----------output--------------
原数组
Array.length:6
Array[www.fanflash.cn]:123
Array[5]:6
Array[4]:5
Array[3]:4
Array[2]:3
Array[1]:2
Array[0]:1
delete删除
Array.length:6
Array[5]:6
Array[4]:5
Array[3]:4
Array[2]:3
Array[1]:2
Array[0]:1
再讲一下数组的小点滴,记得我在有一篇教程里面讲过了,数组的长度是由最大的数值下标决定的,并不是由数组中有多少元素决定的,非数值型下标的元素不在长度的记算之中(其实就算是数值的,也只有最高位在计算之中),也就是说你新建一个数组,如附一值array[1000]=34,那么,他的长度就是1000+1=1001.
2.使用splice删除:
使用splice删除与delete的区别有两点,第一点是它只能删除是数值下标的项,第二点是他删除完后会把删除项的空用后面的数据补充,并且数组长度也会相应减少,因此这个才是真正的删除:
trace("原数组");
var t:Array = [1, 2, 3, 4, 5, 6];
toArrString(t);
trace("splice删除");
t.splice(3, 1);
toArrString(t);
toArrString2(t);
/**
* 返回数组中的无素
* @author http://www.fanflash.cn
* arr:要显示出项值的数组
*/
function toArrString(arr:Array) {
var len:Number = arr.length;
trace("Array.length:"+len);
for (var i in arr) {
trace("Array["+i+"]:"+arr);
}
trace("\n");
}
function toArrString2(arr:Array) {
var len:Number = arr.length;
trace("Array.length:"+len);
for (var i = 0; i<len; i++) {
trace("Array["+i+"]:"+arr);
}
trace("\n");
}
----------output--------------
原数组
Array.length:6
Array[5]:6
Array[4]:5
Array[3]:4
Array[2]:3
Array[1]:2
Array[0]:1
splice删除
Array.length:5
Array[4]:6
Array[3]:5
Array[2]:3
Array[1]:2
Array[0]:1
Array.length:5
Array[0]:1
Array[1]:2
Array[2]:3
Array[3]:5
Array[4]:6
可以看到数组的第四项已经被后面的数据所代替,而长度也减少一.
2.使用undefined or null附值:
很遗憾,这不是VB,所以这种方法并不是真正删除这个值,无论使用那种方法遍历都是有这个项的存在,只是这个项的值特殊了一点,不过用这方法来标记这个数据已经不存在还是可以的,在使用时判断这个值是否等于undefined 或者 unll就知道这个项有没有值:
trace("原数组");
var t:Array = [1, 2, 3, 4, 5, 6];
toArrString(t);
trace("附值undefined or null");
t[1]=undefined
t[2]=null
toArrString(t);
toArrString2(t);
/**
* 返回数组中的无素
* @author http://www.fanflash.cn
* arr:要显示出项值的数组
*/
function toArrString(arr:Array) {
var len:Number = arr.length;
trace("Array.length:"+len);
for (var i in arr) {
trace("Array["+i+"]:"+arr);
}
trace("\n");
}
function toArrString2(arr:Array) {
var len:Number = arr.length;
trace("Array.length:"+len);
for (var i = 0; i<len; i++) {
trace("Array["+i+"]:"+arr);
}
trace("\n");
}
----------output--------------
原数组
Array.length:6
Array[5]:6
Array[4]:5
Array[3]:4
Array[2]:3
Array[1]:2
Array[0]:1
附值undefined or null
Array.length:6
Array[5]:6
Array[4]:5
Array[3]:4
Array[2]:null
Array[1]:undefined
Array[0]:1
Array.length:6
Array[0]:1
Array[1]:undefined
Array[2]:null
Array[3]:4
Array[4]:5
Array[5]:6