如何从表中获取所有数据名称

我在我的lua文件中有一个全局变量的嵌套表,如下所示:

GLOBAL.ADVANTAGES =
{
CLASS =
{
    WARRIOR =
    {
        ATTACK = 0,
        DEFEND = 0,
        CRIT_CHANCE = 0,
        CRIT_DAMAGE = 0
    },
    PALADIN =
    {
        ATTACK = 0,
        DEFEND = 0,
        CRIT_CHANCE = 0,
        CRIT_DAMAGE = 0
    },
    PRIEST =
    {
        ATTACK = 0,
        DEFEND = 0,
        CRIT_CHANCE = 0,
        CRIT_DAMAGE = 0
    },
    ...
...

我想遍历表以返回所有变量名称的字符串,例如"GLOBAL.CLASS.PRIEST.ATTACK","GLOBAL.CLASS.PRIEST.DEFENSE"等等。我已经可以遍历整个表,但它仅返回"ATTACK","DEFENSE"等值...

如何获取每个值的完整"地址"?

点赞
用户2226988
用户2226988

假设你正在进行深度优先遍历(也称为中序遍历),当你下降层次时,向下传递父节点的_path__。在捕获叶子节点的名称时,将其前置为父节点的路径。如果节点不是叶子节点,请在节点的名称前置父节点路径并向下传递。

local node = path .. "." .. tostring(key) -- 如果key不是字符串则使用tostring

将“GLOBAL”用作初始路径。

2018-10-13 00:14:38
用户5697743
用户5697743

更高效和更简单的方法是使用table.concat。例如,要显示所有字段:

local myprint
myprint = function(tab, prefixtab) -- Tab = tab to print, prefix = inital tab ({'GLOBAL'} in your case) or nil
    prefixtab = prefixtab or {}
    local idx = #prefixtab+1
    for k,v in pairs(tab) do
        prefixtab[idx] = k
        print(table.concat(prefixtab, '.')) -- Comment to don't print for every path
        if type(v) == 'table' then
            myprint(v, prefixtab)
        --else -- To print only complete pathes
            --print(table.concat(prefixtab, '.'))
        end
    end
    prefixtab[idx] = nil
end

例如(基于您的表):

> myprint(GLOBAL, {'GLOBAL'})
GLOBAL.ADVANTAGES
GLOBAL.ADVANTAGES.CLASS
GLOBAL.ADVANTAGES.CLASS.WARRIOR
GLOBAL.ADVANTAGES.CLASS.WARRIOR.CRIT_DAMAGE
GLOBAL.ADVANTAGES.CLASS.WARRIOR.ATTACK
GLOBAL.ADVANTAGES.CLASS.WARRIOR.CRIT_CHANCE
GLOBAL.ADVANTAGES.CLASS.WARRIOR.DEFEND
GLOBAL.ADVANTAGES.CLASS.PRIEST
GLOBAL.ADVANTAGES.CLASS.PRIEST.CRIT_DAMAGE
GLOBAL.ADVANTAGES.CLASS.PRIEST.ATTACK
GLOBAL.ADVANTAGES.CLASS.PRIEST.CRIT_CHANCE
GLOBAL.ADVANTAGES.CLASS.PRIEST.DEFEND
GLOBAL.ADVANTAGES.CLASS.PALADIN
GLOBAL.ADVANTAGES.CLASS.PALADIN.CRIT_DAMAGE
GLOBAL.ADVANTAGES.CLASS.PALADIN.ATTACK
GLOBAL.ADVANTAGES.CLASS.PALADIN.CRIT_CHANCE
GLOBAL.ADVANTAGES.CLASS.PALADIN.DEFEND

或者只打印完整路径的版本:

> myprint(GLOBAL, {'GLOBAL'})
GLOBAL.ADVANTAGES.CLASS.PRIEST.CRIT_CHANCE
GLOBAL.ADVANTAGES.CLASS.PRIEST.ATTACK
GLOBAL.ADVANTAGES.CLASS.PRIEST.CRIT_DAMAGE
GLOBAL.ADVANTAGES.CLASS.PRIEST.DEFEND
GLOBAL.ADVANTAGES.CLASS.WARRIOR.CRIT_CHANCE
GLOBAL.ADVANTAGES.CLASS.WARRIOR.ATTACK
GLOBAL.ADVANTAGES.CLASS.WARRIOR.CRIT_DAMAGE
GLOBAL.ADVANTAGES.CLASS.WARRIOR.DEFEND
GLOBAL.ADVANTAGES.CLASS.PALADIN.CRIT_CHANCE
GLOBAL.ADVANTAGES.CLASS.PALADIN.ATTACK
GLOBAL.ADVANTAGES.CLASS.PALADIN.CRIT_DAMAGE
GLOBAL.ADVANTAGES.CLASS.PALADIN.DEFEND
2018-10-14 16:09:31