阅读完整表格中的完整表格

时间:2016-11-21 16:30:08

标签: lua

如何在完整的表格中阅读完整的表格?

test = {}
test["Hello"] = "World"
test["tab"] = {}
test["tab"]["example"] = "ex"
test["tab"]["whats"] = "up"
test["seta"] = {}
test["seta"]["ask"] = "question"
test["seta"]["hard"] = {}
test["seta"]["hard"]["cool"] = "lua"

这是一个我想阅读的表。我需要一张包含以下内容的表格:

"test.Hello" "World"
"test.tab.example" "ex"
"test.tab.whats" "up"
"test.seta.ask" "question"
"test.seta.hard.cool" "lua"

左边是索引器,右边是内容。有人有想法吗?我读的那张桌子也可以是

Thats["a"]["very"]["big"]["table"]

或者说比较。谢谢你的回答。

2 个答案:

答案 0 :(得分:1)

首先,解决具有键字符串和键值的表的问题(即没有嵌套表):

function longkeys(object)
    local out = {}
    for key, value in pairs(object) do
        table.insert(out, {longkey = key, value = value})
    end
    return out
end

for _, pair in pairs(longkeys(test)) do
    print("test." .. pair.longkey, pair.value)
end

这会将Hello mappin正确地捕获到World,但会将tab映射到table: 00B6A488

我们可以修改longkeys函数,只要它是一个表,就递归检查value

function longkeys(object)
    local out = {}
    for key, value in pairs(object) do
        if type(value) == "table" then
            local keysof = longkeys(value)
            for _, pair in pairs(keysof) do
                pair.longkey = key .. "." .. pair.longkey
                table.insert(out, pair)
            end
        else
            table.insert(out, {longkey = key, value = value})
        end
    end
    return out
end

这依赖于观察这些'longkeys'的递归结构。如果s[k]tLt的长按键且值为v,则k .. "." .. Ls的长按键值v

请注意,该解决方案假定表的结构完全是字符串键=>字符串值|那种形式的表格。

这不适用于其他数据类型或循环表。

另外,请记住,此函数吐出的'longkeys'不一定是有效的Lua表达式,用于获取值;考虑一个带键的表

local bad = {
    ["break"] = "break",
    ["i have a space"] = "space",
    ["i.have.dots"] = "dots",
    ["i\\have\"quotes"] = "quotes",
}

输出将给出

bad.break
bad.i have a space
bad.i.have.dots
bad.i\have"quotes

这些都不是访问bad

的有效方式

答案 1 :(得分:-1)

local function f(r, t, p)
   for k, v in pairs(t) do
      if type(v) == "table" then 
         f(r, v, p..k..".")
      else 
         r[p..k] = v
      end
   end
end

local result = {}
f(result, test, "test.")