当嵌套表与其他数据类型混合时,如何遍历 Lua 中的嵌套表?
How can I loop through nested tables in Lua when the nested tables are mixed in with other data types?
我正在尝试循环遍历 Lua 中的一个非常大的 table,它由许多嵌套的 table 混合数据类型组成。我想将整个数据 table 打印到控制台,但我遇到了嵌套循环的问题。当我执行嵌套循环以打印下一级深键值对时,我收到此错误 bad argument #1 to 'pairs' (table expected, got number)
因为并非所有值都是 tables.
我尝试在嵌套循环之前添加一个 if type(value) == table then
但它从未触发,因为 type(value)
returns userdata
无论它们是整数、字符串还是 tables.
编辑:我错了,只有 table 返回类型 userdata
我的 table 看起来像这样,但是有数百对,并且可以是多个嵌套的 table。我有一个很棒的内置方法 printall()
和我为此使用的工具,但它只适用于第一个嵌套 table。我无法控制这个 table 的外观,我只是在玩游戏的数据,我们将不胜感激。
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
答案:这是我修复此问题的函数的最终版本,它根据 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
type(value)
returns 表示值类型的字符串
更多信息请点击此处:
lua-users.org/wiki/TypeIntrospection
此外,您的示例 table 具有 int
作为某些键的一些值,因为这将是 nil 这些键本质上不是我下面示例的 table 的一部分我会将 int
的每个实例更改为一个数值。
如果你点击 table 而不是进行未知数量的嵌套循环,那么递归也是有意义的。
这里是工作的例子printAll
myTable = {
key1 = { value1 = "string" },
key2 = 2,
key3 = { -- printall() will print all these two as key value pairs
subKey1 = 1,
subKey2 = 2
},
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 = 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("}")
我正在尝试循环遍历 Lua 中的一个非常大的 table,它由许多嵌套的 table 混合数据类型组成。我想将整个数据 table 打印到控制台,但我遇到了嵌套循环的问题。当我执行嵌套循环以打印下一级深键值对时,我收到此错误 bad argument #1 to 'pairs' (table expected, got number)
因为并非所有值都是 tables.
我尝试在嵌套循环之前添加一个 if type(value) == table then
但它从未触发,因为 type(value)
returns userdata
无论它们是整数、字符串还是 tables.
编辑:我错了,只有 table 返回类型 userdata
我的 table 看起来像这样,但是有数百对,并且可以是多个嵌套的 table。我有一个很棒的内置方法 printall()
和我为此使用的工具,但它只适用于第一个嵌套 table。我无法控制这个 table 的外观,我只是在玩游戏的数据,我们将不胜感激。
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
答案:这是我修复此问题的函数的最终版本,它根据 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
type(value)
returns 表示值类型的字符串
更多信息请点击此处: lua-users.org/wiki/TypeIntrospection
此外,您的示例 table 具有 int
作为某些键的一些值,因为这将是 nil 这些键本质上不是我下面示例的 table 的一部分我会将 int
的每个实例更改为一个数值。
如果你点击 table 而不是进行未知数量的嵌套循环,那么递归也是有意义的。
这里是工作的例子printAll
myTable = {
key1 = { value1 = "string" },
key2 = 2,
key3 = { -- printall() will print all these two as key value pairs
subKey1 = 1,
subKey2 = 2
},
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 = 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("}")