Получение всех имен данных из таблицы - PullRequest
0 голосов
/ 13 октября 2018

У меня есть вложенная таблица глобальных переменных в моем файле 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» и т. Д. ...

Как я могу получить полный "адрес" каждого значения?

Ответы [ 2 ]

0 голосов
/ 14 октября 2018

Более эффективным и простым способом является использование 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
0 голосов
/ 13 октября 2018

Предполагая, что вы выполняете обход в глубину (по порядку), когда вы спускаетесь по иерархии, передайте путь для родительского узла.В точке, где вы фиксируете имя листа, добавьте к нему путь родительского узла.Если узел не является листом, добавьте к имени узла путь родительского узла и передайте его вниз.

local node = path .. "." .. tostring(key) -- tostring used in case key is not a string

Используйте «GLOBAL» в качестве начального пути.

...