如何在完整的表格中阅读完整的表格?
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"]
或者说比较。谢谢你的回答。
答案 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]
为t
且L
是t
的长按键且值为v
,则k .. "." .. L
是s
的长按键值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.")