Lua中如何循环遍历嵌套表,当其中有混合了其他数据类型的嵌套表时怎么办?

我正在尝试循环遍历一个由许多嵌套表混合数据类型组成的非常大的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
点赞
用户7396148
用户7396148

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("}")
2020-01-21 00:27:37