请参考:数据类型 - table
table.insert 函数
函数原型:
table.insert(tab,value ,pos = 1)
说明:
在 table 类型参数 tab 中插入元素(value)。
参数 pos 指定插入位置.如果指定 pos 参数,table.insert首先在tab[pos]
插入 value 并将后面的所有元素顺序向后移动。pos 为可选参数,默认值为1( 在数组开始插入 )。
table.remove 函数
函数原型:
value = table.remove (tab ,pos = 1)
说明:
在数组指定位置移除元素,然后从此位置开始将所有元素前移一位。
可选用 pos 参数指定移除元素的位置,默认值为1(即在数组开始移除)。
返回值为移除的元素。
如果您不希望在删除元素后改变其他的元素的位置,可以使用赋值为 null 的方法删除一个元素。
示例:
var tab = {"a";"b";"c";"d";"e"}
//移除第二个元素,后面的元素全部向前移动一个单位.
table.remove (tab ,2);
//删除第二个元素,不会改变其他元素的位置
tab[2] = null; 。
堆栈操作避免了数组的重新排序,效率高于 table.insert,table.remove 。
table.push 函数
函数原型:
table.push(tab ,value[, value , ... ] )
函数说明:
在数组尾部添加一个或多个值。table.push返回新数组的长度(最后一个元素所在的索引)
如果连续 push 多个值,例如:
table.push(tab ,a)
table.push(tab ,b)
table.push(tab ,c)
应当放到一个push操作中效率会更好一些,例如:
table.push(tab,a,b,c)
table.pop 函数
函数原型:
table.pop(tab [, n] )
函数说明:
在数组尾部弹出一个或n个值。 n为可选参数,默认为 1 。 返回值为一个或 n 个移除的数组元素。
示例
//实现一个堆栈类
class stack {
//继承 stack 名字空间的静态成员
@{ _get = self }
}
namespace stack{
push = function( ... ){
..table.push( owner , ... );
}
pop = function( n ){
return ..table.pop( owner , n );
}
}
//创建新的堆栈对象
var sk = stack();
//压入一个或多个参数
sk.push("a","b","c")
//弹出一个或多个值
var a,b,c = sk.pop(3);
函数原型:
var min , max = table.range( array )
函数说明:
获取 table 类型参数 array 的数组索引最小值与最大值。
一般只有稀疏数组才需要用到 table.range 函数。
普通有序数组,数组索引默认从 1 开始,使用 # 操作符可以直接获取数组长度。
示例:
import console;
//创建数组,数字索引默认从1开始
var arr = { 123;456;77;99 };
console.log( table.range( arr ) );
console.pause();
用 for 循环顺序遍历有序数组所有元素。
参考:for 循环语句
import console;
//创建数组,数字索引默认从1开始
var tab = {123;456;789};
//循环遍历数组
for i=1; #tab;1 {
console.log( tab[i] );
}
console.pause();
上面的方法对于稀疏数组是低效的。
例如:
var tab = {};
tab[100000] = 100;
这时候,我们可以用泛型 for 循环遍历稀疏数组元素。
import console;
//创建数组
var tab = {"字符串";123;"字符串2";23;56;78;99;123;0;test=123};
//稀疏数组
tab[1000] = 123;
//遍历数组
for index,value in tab {
//仅遍历索引为数值的成员
if( type(index) == "number" ){
console.log( index , value )
}
}
console.pause();
函数原型:
table.sort (tab [, cmpProc])
说明:
对数组参数 tab 重新排序,直接修改原数组,函数无返回值。
cmpProc 可选指定一个排序回调函数用于比较两个元素的大小。
table.sort 在排序过程中,每遇到两个元素就调用 cmpProc 函数比较大小,并将两个元素作为参数传递给 cmpProc 函数。
cmpProc = function(b) { return owner < b; };
如果 cmpProc 函数认为第一个参数比较小返回 true ,否则返回 false。注意函数判断的是小于而不是小于等于,两值相等不应当返回 true。 如果没有提供排序回调函数,table.sort 默认调用小于操作符比较两个元素的大小。
请看下面的例子:
import console;
//定义数组
var tab ={3;4;7;8;6;5;2;1}
//默认排序
table.sort(tab);
//显示 1 2 3 4 5 6 7 8
console.dumpTable(tab)
//table.sort会调用这个函数比较元素大小
var cmpProc = function(next) {
//反过来排序
return owner > next ;
};
//自定义排序
table.sort(tab,cmpProc);
//显示倒序
console.dumpTable(tab)
console.pause();
table.sort 是对数组的值域进行排序,不能对字典排序,也不能对键域(下标域)进行排序。如果我们需要对字典进行排序,可以自已写一个迭代器。将字典中的数据复制到一个数组中然后进行排序。
实际上标准库有个 table.eachName 函数可以实现此功能。
下面我们介绍如何使用 table.eachName 迭代器对 table 中名值域进行排序. table.eachName 的源码在 builtin.table 库中可以找到。
示例:
import console;
//定义表
var tab ={c=2;d=7;e=4;g=2;h=8;a=1;b=6;f=5;i=1;j=1;k=9};
//按键名排序遍历表
for k,v in table.eachName(tab) {
console.log(k,v);
}
console.pause();
函数原型:
table.reverse(tab)
函数说明:
将一个table数组按原来的顺序反向排列。
注意这个函数没有返回值,直接修改原来的table
函数示例:
import console;
var tab = { 1;2;3;4;5;6;7}
table.reverse(tab); //反序排列
for(i = 1;#tab;1){
console.log( tab[i] )
}
console.pause();
函数原型:
table.unpack(tab,i=1,e=#tab)
函数说明:
参数 @tab:表对象
参数 @i :起始索引,默认为 1
参数 @e:结束索引,默认数组长度。
返回值:从索引位置 i ,到索引位置 e ,索引位置可为负数(表示自数组尾部倒序索引),拆分并返回 table 对象的数组成员。
如果不指定结束索引,或任何一个索引参数为负数时,table.unpack() 将会获取有序数组长度,这种用法不支持稀疏数组。
参考:稀疏数组
当起始索引与结束索引都明确指定且都大于零,table.unpack() 则不检测顺序数组的长度,因此可以支持稀疏数组,例如下面的代码:
table.unpack( {1;2;[7]=7},1,7 ) //返回1,2,null,null,null,null,7
改用 table.unpackArgs 可自动获取稀疏数组的索引范围并展开所有元素。table.unpackArgs 最好不要用于有超大索引的稀疏数组,这个函数一个常见的作用是用来展开被包装到数组中的不定参数,参数组成的数组可能因为包含 null 值而成为稀疏数组,但包含的元素一般都很少,不会有超大索引,所以适合用 table.unpackArgs 展开 。
table.left
原型:
table.left(tab,len)
说明:
参数 @tab:表对象
参数 @len:从数组左侧返回的数组元素个数。
返回值:从数组左侧拆分并返回 table 对象的 len 个数组成员。len 如果为负数,则从右侧倒数指定索引的成员向左截取所有元素。
table.right
原型:
table.right(tab,len)
说明:
参数 @tab:表对象
参数 @len:从数组右侧返回的数组元素个数。
返回值:从数组右侧拆分并返回 table 对象的 len 个数组成员。len 如果为负数,则从左侧倒数指定索引的成员向右截取所有元素。
函数原型:
table.tostring( tab [,binary])
函数说明:
将第一个参数 @tab 指定的 table 对象序列化为 aardio 代码构造表的字符串,可序列化的元素必须使用合法的标志符、或数值作为键。
如果指定第二个可选参数 @binary 为 true,则序列化使用二进制指令,序列化得到的表不适合直接编辑。
函数示例:
import console;
var tab = {1;2;3;a=123;b='456'};
str = table.tostring( tab ); //序列化为字符串(aardio代码)
console.log( table.tostring( tab ) );
console.pause();
函数原型:
table.concat(tab,tab2[,tab3 [,... ] ])
函数说明:
将多个表连接为一个新的表,表中如包含数组,索引值修改为原索引值加上在新表中的位置
函数说明:
import console;
var tab = {1,2,3};
var tab2 = {4,5,6};
//将多个表拼接为一个表
var tab3 = table.concat(tab,tab2 );
console.log( table.unpack( tab3 ) );
console.pause();