揭开AS程序的外纱(八) -- 容易被忽视的数组实用功能
2010-08-27 09:16
253 查看
1. length属性用来删除数组元素
假设我们定义了这样一个数组:
var arr:Array = new Array("first","second","third","four","five");
我想删除后面3个元素,怎么做最方便呢?
答案:用length属性!
arr.length = 2;
运行之后,立即达到想要的效果。
2. 用splice删除元素、插入元素
splice是一个非常实用的命令,即可以用来删除元素,也可以用来插入元素,你都会用不?
(1) 删除元素
假设还是上面那个数组,我要删掉中间第2到第4三个值,要怎么做呢?
答案是:arr.splice(1,3);
如果用arr.splice(2);效果和arr.length = 2一样!也是删除数组的利器!
(2) 插入元素
如果我要在第二个元素后面插入"old"和"new"这2个元素,要怎么做呢?
答案是:arr.splice(2,0,"old","new");
splice的参数说明我就不写了,大家看下帮助文档吧。这个方法是非常实用的!
3. 怎么样才能最方便的复制数组?
(1) 用slice命令复制数组(浅复制)
还是以上面的那个数组为例,我要复制这个数组,怎么样最方便呢?
答案:var newarr:Array = arr.slice();
这里我提到一个浅复制的概念。什么是浅复制呢?就是说,如果这个数组和示例中那样,都是由基元数据组成(int、uint、number、string等),那么用slice方法可以完全复制!但如果这个数组的元素包含object,那么复制下来的只是一个指针,如果对该元素做修改,原来那个数组的该元素也同样会被修改,所以叫浅复制!
我举个例子,在第一帧写入代码如下:
var tobj:Object = {tt:5}; //定义一个object
var tarr:Array = new Array(tobj); //定义一个数组
var carr:Array = tarr.slice(); //用slice方式复制数组
trace(tarr[0].tt); //输出:5
carr[0].tt = 6; //修改复制的数组的第一项
trace(carr[0].tt); //输出:6
trace(tarr[0].tt); //输出:6
从该例子可以清楚的看到,slice只能实现浅复制,但其实已经非常实用了!
(2) 如何实现深复制?
如果真的有必要用到深复制,那么只能自己写函数了。我下面写一个示例,实现深复制。用到的具体方法就不详细叙述了,如果大家有需要直接搬过去用就可以了!
var tobj:Object = {tt:5};
var tarr:Array = new Array(tobj);
var carr:Array = depthCopy(tarr);
trace(tarr[0].tt); //输出:5
carr[0].tt = 6;
trace(carr[0].tt); //输出:6
trace(tarr[0].tt); //输出:5
//该函数实现深复制
function depthCopy(source:Array) {
var by:ByteArray = new ByteArray();
by.writeObject(source);
by.position = 0;
return(by.readObject());
}
这三个方法,在平时的使用中都是很实用的,但也是比较容易被忽视的。希望大家都能熟练这三个用法!
假设我们定义了这样一个数组:
var arr:Array = new Array("first","second","third","four","five");
我想删除后面3个元素,怎么做最方便呢?
答案:用length属性!
arr.length = 2;
运行之后,立即达到想要的效果。
2. 用splice删除元素、插入元素
splice是一个非常实用的命令,即可以用来删除元素,也可以用来插入元素,你都会用不?
(1) 删除元素
假设还是上面那个数组,我要删掉中间第2到第4三个值,要怎么做呢?
答案是:arr.splice(1,3);
如果用arr.splice(2);效果和arr.length = 2一样!也是删除数组的利器!
(2) 插入元素
如果我要在第二个元素后面插入"old"和"new"这2个元素,要怎么做呢?
答案是:arr.splice(2,0,"old","new");
splice的参数说明我就不写了,大家看下帮助文档吧。这个方法是非常实用的!
3. 怎么样才能最方便的复制数组?
(1) 用slice命令复制数组(浅复制)
还是以上面的那个数组为例,我要复制这个数组,怎么样最方便呢?
答案:var newarr:Array = arr.slice();
这里我提到一个浅复制的概念。什么是浅复制呢?就是说,如果这个数组和示例中那样,都是由基元数据组成(int、uint、number、string等),那么用slice方法可以完全复制!但如果这个数组的元素包含object,那么复制下来的只是一个指针,如果对该元素做修改,原来那个数组的该元素也同样会被修改,所以叫浅复制!
我举个例子,在第一帧写入代码如下:
var tobj:Object = {tt:5}; //定义一个object
var tarr:Array = new Array(tobj); //定义一个数组
var carr:Array = tarr.slice(); //用slice方式复制数组
trace(tarr[0].tt); //输出:5
carr[0].tt = 6; //修改复制的数组的第一项
trace(carr[0].tt); //输出:6
trace(tarr[0].tt); //输出:6
从该例子可以清楚的看到,slice只能实现浅复制,但其实已经非常实用了!
(2) 如何实现深复制?
如果真的有必要用到深复制,那么只能自己写函数了。我下面写一个示例,实现深复制。用到的具体方法就不详细叙述了,如果大家有需要直接搬过去用就可以了!
var tobj:Object = {tt:5};
var tarr:Array = new Array(tobj);
var carr:Array = depthCopy(tarr);
trace(tarr[0].tt); //输出:5
carr[0].tt = 6;
trace(carr[0].tt); //输出:6
trace(tarr[0].tt); //输出:5
//该函数实现深复制
function depthCopy(source:Array) {
var by:ByteArray = new ByteArray();
by.writeObject(source);
by.position = 0;
return(by.readObject());
}
这三个方法,在平时的使用中都是很实用的,但也是比较容易被忽视的。希望大家都能熟练这三个用法!
相关文章推荐
- 揭开AS程序的外纱(二) -- 被忽视的数据类型
- 下列程序定义了3×3的二维数组,并在主函数中赋值。请编写函数fun,函数的功能使求出数组周边元 素的平均值并作为函数值返回给主函数中的?
- 面程序的功能是将一个4×4的数组进行逆时针旋转90度后输出,要求原始数组的数据随机输入,原新数组以4行4列的方式输出
- 阿里经验!聊聊实用而容易被人忽视的设计整理术
- 程序功能:建立一个带有头结点的单向链表,并将存储在数组中的字符依次转储到链表的各个结点中。
- 程序功能:建立一个带有头结点的单向链表,并将存储在数组中的字符依次转储到链表的各个结点中。
- 【系列索引】抓虫系列 从基本程序、架构出发抓出项目中容易忽视的问题
- 揭开AS程序的外纱(三) -- 一统事件侦听
- 在字符数组中容易忽视的一些小的问题
- 揭开AS程序的外纱(四) -- 全屏模式的那点事
- 容易忽视但是功能灰常强大的Java API(一、排序)
- 容易忽视但是功能灰常强大的Java API
- C语言小程序------------数组实现栈功能(一)
- 揭开AS程序的外纱(十) -- 类的一些常用用法
- 容易忽视但是功能灰常强大的Java API
- 容易忽视但是功能灰常强大的Java API(二. 读写对象)
- 桌面工具! 桌面提醒、语音报时、快速启动常用程序、网络校时、桌面背景随时换功能等。实用!!
- 揭开AS程序的外纱(一) -- 程序是什么? 推荐
- 阿里经验!聊聊实用而容易被人忽视的设计整理术
- 揭开AS程序的外纱(九) -- 手把手,编写自己的类