在 Lua 中,表(table)中的元素本身是无序存储的(从 Lua 语言设计角度来说并没有严格保证顺序),尽管你在代码里按照一定顺序书写了table里的各个子表元素,但当你去查看打印这个表的内容时,它呈现出来的顺序可能看起来是“乱序”的,主要原因如下:
表的内部实现机制
表在 Lua 内部是基于哈希表(对于非数组部分的键值对)和数组(对于连续正整数键的部分)的混合数据结构来实现的。
温馨提示:此处内容需要登录后才能查看!
遍历方式的影响
比如,如果你使用类似如下的简单 for
循环遍历 taskList.boxList
表来打印元素:
for _, element in pairs(taskList.boxList) do
print(element.remarks)
end
pairs
函数用于遍历表中的所有键值对,它遵循的顺序就是基于表内部的存储顺序(也就是前面提到的哈希相关的机制决定的顺序),而不是你期望的代码书写顺序,所以打印出来的各个子表对应的成员看起来就是乱序的。
如果你希望按照特定顺序来处理这些元素,有几种常见做法:
1. 采用数组形式并严格按照顺序索引
如果 taskList.boxList
里的元素可以按照顺序编号,像这样定义:
taskList.boxList = {
[1] = {
remarks = '开宝箱得金币',
layer = 3,
mark = {
{text = {'开宝箱得金币', '开.*(币|市)'}, rect = {0.66403, 0.78333, 0.99802, 1.00000, '右下'}}
},
click = true,
delay = 2 * 1000
},
[2] = {
remarks = '开宝箱时间未到',
layer = 3,
mark = {
{text = {'.+分.+秒.*'}, rect = {0.66403, 0.78333, 0.99802, 1.00000, '右下'}}
},
isBreak = true
},
[3] = {
remarks = '顶层浮窗-看广告',
layer = 5,
mark = {
{text = {'^看广告视频再赚.*金币$'}, rect = {0.11739, 0.22667, 0.86680, 0.77889, '中间'}}
},
click = true,
delay = 5 * 1000,
children = {
{
name = '子任务:看广告领金币',
limitTime = 3 -- 最大运行时长(分钟)
},
taskList.adMainList,
taskList.publicList,
taskList.exitList
}
}
}
然后使用基于数字顺序的 for
循环遍历:
for i = 1, #taskList.boxList do
print(taskList.boxList[i].remarks)
end
这样就能按照你定义元素的顺序来处理了,因为这种情况下 Lua 会把它当作数组结构的部分来对待,遵循数组的顺序特性。
这种实现方式,缺点是不便于维护。后面要插入数据的时候,里面的索引都需要做相应的修改。
2. 额外维护顺序信息
可以定义一个单独的列表来记录元素的顺序,比如:
taskList.boxListOrder = {'开宝箱得金币', '开宝箱时间未到', '顶层浮窗-看广告'}
taskList.boxList = {
['开宝箱得金币'] = {
remarks = '开宝箱得金币',
layer = 3,
mark = {
{text = {'开宝箱得金币', '开.*(币|市)'}, rect = {0.66403, 0.78333, 0.99802, 1.00000, '右下'}}
},
click = true,
delay = 2 * 1000
},
['开宝箱时间未到'] = {
remarks = '开宝箱时间未到',
layer = 3,
mark = {
{text = {'.+分.+秒.*'}, rect = {0.66403, 0.78333, 0.99802, 1.00000, '右下'}}
},
isBreak = true
},
['顶层浮窗-看广告'] = {
remarks = '顶层浮窗-看广告',
layer = 5,
mark = {
{text = {'^看广告视频再赚.*金币$'}, rect = {0.11739, 0.22667, 0.86680, 0.77889, '中间'}}
},
click = true,
delay = 5 * 1000,
children = {
{
name = '子任务:看广告领金币',
limitTime = 3 -- 最大运行时长(分钟)
},
taskList.adMainList,
taskList.publicList,
taskList.exitList
}
}
}
for _, key in ipairs(taskList.boxListOrder) do
print(taskList.boxList[key].remarks)
end
通过这种方式,你可以自行控制遍历的顺序,先按照期望顺序的列表来获取对应的表元素的键,再根据键去访问实际的表元素进行操作,从而实现按照你想要的顺序来处理这些原本无序存储的表元素。
这种实现方式,缺点是每个节点都需要单独申明一次。后面需要插入数据的时候,只需要修改boxListOrder表即可
1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】table表中乱序的处理
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » 【懒人精灵】table表中乱序的处理