遍历嵌套表的lua

我是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 tprinttblindentif not indent then indent = 0 end
  for kv in pairstbldo
    formatting = string.rep("  ", indent) .. k .. ": "
    if type(v) == "table" then
      print(formatting)
      tprint(v,indent + 1elseif type(v) == 'boolean' then
      print(formatting .. tostring(v))
    else
      print(格式化.. v)
    end
  end
end

函数吞下(路径)
    local f = io.openpathlocal 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"

当然,错误= pcallfunction()
    for keyvalue in pairstabdo
      if string.matchkey,"zone")然后--最高优先级,首先检查它
        for subkeysubvalue in pairsvaluedo
          if string.matchsubkeyzone_varthen
            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
点赞
用户6800389
用户6800389

我太难为情了,居然要这么长时间才能理解这个。 :/

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)
2018-06-12 07:28:20