遍历嵌套表的lua
2018-6-12 6:31:55
收藏:0
阅读:74
评论:1
我是lua的新手,对于工作中的嵌套数据结构处理很困难。
我正在尝试编写一个层次结构系统,其中我有三个键的表,值是另一个表。这三个最高级的键按我的特定程度排列为zone,region和environment。我想使用存在于与我的环境变量的关键字相关的表中的最具体子值。
因此,给定下表和下面的环境变量,我想返回region.US键,因为区域变量不存在于该表中,尽管如果存在的话,那将是最高优先级。关键的region.US存在并且比环境更具优先级,因此我应该返回ccc。
根据lua加载表的方式,通过字符串匹配顶级键会得到不同的结果。我该如何在Lua中做到这一点?
env_zone = 5 --不存在于表中,但如果存在时应该返回
env_region = US --存在并应该返回,因为env_zone不存在
env_environment = food --存在但不应返回,因为env_region更具优先级
zone:
1: aaaaa
2: bbbbb
region:
EU: ddd
US: ccc
environment:
food: gggg
prod: eee
staging: fff
我的代码无法正常工作。
local cjson = require('cjson')
function tprint(tbl,indent)
if not indent then indent = 0 end
for k,v in pairs(tbl)do
formatting = string.rep(" ", indent) .. k .. ": "
if type(v) == "table" then
print(formatting)
tprint(v,indent + 1)
elseif type(v) == 'boolean' then
print(formatting .. tostring(v))
else
print(格式化.. v)
end
end
end
函数吞下(路径)
local f = io.open(path)
local s = f:read"*a")
f:close()
回报s
结束
local json_string = slurp("data.json")
local tab = cjson.decode(json_string)
local zone_var = os.getenv("zone") -- "fake"
local region_var = os.getenv("region") -- "US"
local env_var = os.getenv("env") -- "food"
当然,错误= pcall(
function()
for key,value in pairs(tab)do
if string.match(key,"zone")然后--最高优先级,首先检查它
for subkey,subvalue in pairs(value)do
if string.match(subkey,zone_var)then
print(subvalue)
return
end
end
elseif string.match(key,"region")然后--第二高优先级
for subkey,subvalue in pairs(value)do
if string.match(subkey,region_var)then
print(subvalue)
return
end
end
elseif string.match(key,"环境")然后--最后机会
for subkey,subvalue in pairs(value)do
if string.match(subkey,env_var)then
print(subvalue)
return
end
end
end
end
end
)
tprint(tab)
输出:应始终返回ccc
➜lua git:(集成)-#lua test1.lua
gggg
环境:
staging:fff
prod:eee
food:gggg
区域:
US:ccc
EU:ddd
区域:
1: aaaaa
2: bbbbb
...
➜lua git:(集成)-#lua test1.lua
ccc
区域:
1: aaaaa
2: bbbbb
区域:
EU:ddd
US:ccc
环境:
食品:gggg
白色:eeee
作业:fff
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

我太难为情了,居然要这么长时间才能理解这个。 :/
local cjson = require('cjson') -- 标准输出函数 -- tbl: 要输出的表格,indent: 缩进级别 function tprint (tbl, indent) if not indent then indent = 0 end for k, v in pairs(tbl) do formatting = string.rep(" ", indent) .. k .. ": " if type(v) == "table" then print(formatting) tprint(v, indent+1) elseif type(v) == 'boolean' then print(formatting .. tostring(v)) else print(formatting .. v) end end end -- 读取文件内容函数 -- path: 文件路径,返回值: 文件内容 local function slurp(path) local f = io.open(path) local s = f:read("*a") f:close() return s end -- 读取 json 文件 local json_string = slurp("data.json") local tab = cjson.decode(json_string) -- 读取环境变量 local zone_var = os.getenv("zone") local region_var = os.getenv("region") local environment_var = os.getenv("environment") -- 查找 json 中的对应值并输出 local ok, err = pcall( function() for key, value in pairs(tab.zone) do if string.match(key, zone_var) then print(value) return end end for key, value in pairs(tab.region) do if string.match(key, region_var) then print(value) return end end for key, value in pairs(tab.environment) do if string.match(key, environment_var) then print(value) return end end end ) -- 输出整个 json tprint(tab)