【懒人精灵】table表中乱序的处理

file

在 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表中乱序的处理

企业级大数据智能营销管理系统

了解详情