如何在table中读取完整表格

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

测试={}
测试[“你好”]=“世界”
测试[“tab”]={}
测试[“tab”][“example”]=“ex”
测试[“tab”][“whats”]=“up”
测试[“seta”]={}
测试[“seta”][“ask”]=“question”
测试[“seta”][“hard”]={}
测试[“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”]

或更大。谢谢你的回答。

点赞
用户2616735
用户2616735

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

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”对应于“World”,但它将映射,例如,“tab”到“table: 00B6A488”。

我们可以修改“longkeys”函数以递归检查每当它是一个表时的“值”:

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是具有值vt的“longkey”,那么k..“。”..L是具有值vs的“longkey”。

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

这在其他数据类型或循环表中不起作用。

此外,请记住,该函数生成的“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”表的有效方法。

2016-11-21 16:40:50
用户1847592
用户1847592
## 将下面翻译成中文并且保留原本的 markdown 格式

```lua
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.")

定义了一个名为 f 的本地函数,接受三个参数 rtp。该函数使用 pairs 循环遍历 t 表中的所有键值对,如果当前键对应的值为表,则递归调用 f 函数。如果是其他类型的值,则将该键值对存入结果表 r 中,键为 p..k 的字符串。 p 参数在每次递归时被用来拼接当前键名,以便在结果表中区分不同层级的键名。

创建一个空表 result,并将其作为第一个参数传入 f 函数中,将需要处理的表 test 作为第二个参数传入,将初始键名前缀字符串 "test." 作为第三个参数传入。最终,result 表中会存储 test 表中所有键值对的拷贝,但键名都加了 "test." 前缀。

2016-11-21 19:31:56