数组

数组是有序的元素序列, 元素可以是任意的类型, 如整型、字符串或者自定义类型.

数组元素可以通过索引(下标)来读和写, 索引从 0 开始, 第二个索引为 1, 以此类推.

声明

声明一个数组的语句如下:

arr = [1, "Two", "三"]

访问数组元素

数组元素可以通过索引(位置)来读取. 格式为数组名后加中括号, 中括号中为索引的值. 例如:

print('第三个元素为:', arr[2]);

如果索引超出长度, 会抛出异常, 可参考下方可选链

如果索引x为负数, 会取倒数第abs(x)个元素

切片

可以通过以下方式获得数组的部分元素

arr = [1, "Two", "三", "IIII", 5.0001];
print(arr[1:3]); // 获得第1到第3个之间元素(前闭后开,获得索引1、2)
print(arr[:2]); // 获取前两个元素(获得索引0、1)
print(arr[3:]); // 获取第3个之后的元素(含索引3)
print(arr[-2:]); // 获取最后两个元素
print(arr[:-3]); // 获取倒数第3个之前的元素

索引超出范围时, 不会抛出异常, 而是返回空数组

遍历

for (ind, ele in arr) {
	print(`索引 = ${ind}, 元素 = ${ele}`)
}

长度和容量

  • 通过len方法获得数组的长度
  • 通过cap方法获得数组的容量

示例

arr = [1, 2, 3];

// 长度
print(len(arr));
print(arr.len);

// 容量
print(cap(arr));
print(arr.cap);

容量并不是代表数组的最大长度, 而是在容量范围内增加长度不会重新申请内存, 对于新手而言可以不用关注

数组原型方法

方法名 描述
forEach 遍历元素
map 遍历元素并将返回值重组成一个数组
filter 遍历元素并将返回零的内容去掉后重组
filterMap 遍历元素并将返回非false的元素重组
asyncMap 异步多线程执行任务
find 寻找第一个满足条件的元素
findIndex 寻找第一个满足条件的元素所在的索引
indexOf 寻找第一个相等元素所在的索引
fill 将数组的全部元素设置为某个值
len 数组长度
length 数组长度
every 判断数组内元素是否全部满足条件
some 是否包含某个满足条件的元素
join 使用字符串将数组拼接成一个String
toMap 将数组内的元素组合成map
toBucket 根据某种规则将数组内的元素进行分组
sort 根据排序规则将数组重新排列
reduce 逐个执行方法并将结果传递下去
reverse 将数组元素倒序
concat 拼接另一个数组并返回
slice 获得数组切片
replace(from,to/func,count) 替换元素
shuffle 洗牌,将数组元素打乱

bytearray数组方法

方法名 描述
hex 仅bytearray可调用,转成十六进制
split 仅bytearray可调用,将其分割成多个bytearray
gzip 仅bytearray可调用,将内容进行gzip压缩
ungzip 仅bytearray可调用,将内容进行gzip解压
replace 作为bytearray调用时,和string的replace类似,将内容进行替换

数组指针

绝大多数数组方法不支持修改数组的长度, 如果需要修改, 建议使用数组指针

数组指针具备数组的绝大多数函数和特性

声明

arr = &[]

作为数组使用

arr = &[1, 2, 3, 4]; // Tips: 下一行是以([{开头时, 需要显式以分号结尾本行
(*arr).map(e=>e*e)

数组指针方法

方法名 描述
pop 删除数组末尾的元素
push 添加元素到数组的末尾
shift 删除数组最前面的元素
unshift 添加元素到数组的头部
splice 通过索引添加或删除多个元素
remove 移除多个元素

可选链

如果尝试对数组进行取值时, 索引超出了边界, 会抛出slice index out of range的错误, 此时有两种方式可以试探性取值

  • 数组 ?. index // 如果索引超出边界,返回nil
  • 数组 ? [index] // 如果索引超出边界,返回nil

可选链的更多说明可以参考文档运算符