То, что вы там делаете, крайне неэффективно.Гораздо лучшим подходом было бы разделить строку на каждом .
и просто проиндексировать таблицу.
Простая версия, которая не принимает "что-либо", может выглядеть следующим образом
function findintable(tab, path)
local pos = path:find(".", 1, true)
if pos then
local tab = tab[path:sub(1, pos-1)]
if not type(tab) then error("Expected value to be table, got "..type(tab), 1) end
return findintable(tab, path:sub(pos+1, -1))
else
return tab[path]
end
end
Добавление возможности для любой клавиши (хе ... хе ... хе ...) добавит некоторую сложность и потребует цикла, но это также выполнимо
function findintable(tab, path)
local pos = path:find(".", 1, true)
if not pos then
return tab[path]
end
local key, rest = path:sub(1, pos-1), path:sub(pos+1, -1)
if key == "*" then
for k, v in pairs(tab) do
if type(v)~="table" then return end
local res = findintable(v, rest)
if res then return res end
end
return
else
local tab = tab[path:sub(1, pos-1)]
if not type(tab) then error("Expected value to be table, got "..type(tab), 1) end
return findintable(tab, path:sub(pos+1, -1))
end
end
Это должно делать то, что вы хотите.Просто измените "*" на то, что вы хотите, чтобы заполнитель был.