我正在尝试遍历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() will print all these two as key value pairs subKey1 = int, subKey2 = int }, key4 = { innerKey1 = { -- printall() returns something like : innerKey1 = <int32_t[]: 0x13e9dcb98> nestedValue1 = "string", nestedValue2 = "string" }, innerKey2 = { -- printall() returns something like : 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
ANSWER:这是我修复该函数的最终版本,它与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 -- all tables in this object are the type `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中的一个很大的表,该表由混合数据类型和许多嵌套表组成。我想将整个数据表打印到控制台,但是嵌套循环有麻烦。 ...
[type(value)
返回代表值类型的字符串