Lua中如何循环遍历嵌套表,当其中有混合了其他数据类型的嵌套表时怎么办?
2020-1-22 0:2:12
收藏:0
阅读:105
评论:1
我正在尝试循环遍历一个由许多嵌套表混合数据类型组成的非常大的Lua表。我想将整个数据表打印到控制台,但我在嵌套循环时遇到了麻烦。当我做一个嵌套循环来打印下一级深度的键值对时,我得到了这个错误 bad argument # 1 to 'pairs'(table expected, got number) ,因为并不是所有的值都是表。
我尝试在嵌套循环的前面添加一个 if type(value) == table then ,但它从未触发,因为 type(value) 返回 userdata,无论它们是整数、字符串还是表。
编辑:我错了,只有表的类型是 userdata
我的表看起来像这样,但是有数百对键值对,可能有几个嵌套表。我使用的工具有一个很棒的内置方法 printall(),但它只适用于第一个嵌套表。我无法控制这个表的样子,我只是在处理一个游戏的数据,任何帮助都将不胜感激。
myTable = {
key1 = { value1 = "string" },
key2 = int,
key3 = { -- printall() 将打印所有这两个键值对
subKey1 = int,
subKey2 = int
},
key4 = {
innerKey1 = { -- printall() 返回类似以下内容: innerKey1 = <int32_t[]: 0x13e9dcb98>
nestedValue1 = "string",
nestedValue2 = "string"
},
innerKey2 = { -- printall() 返回类似以下内容: innerKey2 = <vector<int32_t>[41]: 0x13e9dcbc8>
nestedValue3 = int,
nestedValue4 = int
}
},
keyN = "string"
}
我的循环
for key, value in pairs(myTable) do
print(key)
printall(value)
for k,v in pairs(value) do
print(k)
printall(v)
end
end
print("====")
end
答案:这是我修正后的最终版本,它略微修改了Nifim的答案以解决破坏的边缘情况。
function printFullObjectTree(t, tabs)
local nesting = ""
for i = 0, tabs, 1 do
nesting = nesting .. "\t"
end
for k, v in pairs(t) do
if type(v) == "userdata" then -- 这个对象中的所有表都是类型 `userdata`
print(nesting .. k .. " = {")
printFullObjectTree(v, tabs + 1)
print(nesting .. "}")
elseif v == nil then
print(nesting .. k .. " = nil")
elseif type(v) == "boolean" then
print(nesting .. k .. " = " .. string.format("%s", v))
else
print(nesting .. k .. " = " .. v)
end
end
end
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

type(value)返回一个表示值类型的字符串。更多信息在这里: lua-users.org/wiki/TypeIntrospection
此外,您的示例表中有一些键的
int值,由于这将是nil,因此这些键基本上不是表的一部分。在我下面的示例中,我将每个int实例更改为数字值。如果遇到表而不是制作未知数量的嵌套循环,那么递归也是有意义的。
下面是一个工作
printAll的例子:myTable = { key1 = { value1 = "string" }, key2 = 2, key3 = { -- printall() 将打印所有这两个键值对 subKey1 = 1, subKey2 = 2 }, key4 = { innerKey1 = { -- printall() 返回类似这样的内容: innerKey1 = <int32_t[]: 0x13e9dcb98> nestedValue1 = "string", nestedValue2 = "string" }, innerKey2 = { -- printall() 返回类似这样的内容: innerKey2 = <vector<int32_t>[41]: 0x13e9dcbc8> nestedValue3 = 3, nestedValue4 = 4 } }, keyN = "string" } function printAll(t, tabs) local nesting = "" for i = 0, tabs, 1 do nesting = nesting .. "\t" end for k, v in pairs(t) do if type(v) == "table" then print(nesting .. k .. " = {") printAll(v, tabs + 1) print(nesting .. "}") else print(nesting .. k .. " = " .. v) end end end print("myTable = {") printAll(myTable, 0) print("}")