【问题标题】:Lua: Table as tree of keys of another tableLua:表作为另一个表的键树
【发布时间】:2017-09-20 00:38:14
【问题描述】:

我真的需要这样的东西,但无法通过互联网找到如何做到这一点。我有值表,其中第一个应该变成另一个表的键,但第二个值应该是前一个值的键,依此类推。如果硬编码,它看起来像这样:

tab["key1"]["key2"]["key3"]...["keyn-1"]["keyn"] = "value"

但是我有动态的键表,我不知道当我想插入这个键树时它会是什么样子。我想要可以让我在树中间添加新分支的解决方案,例如:

tab["key1"]["key2"] = 123
tab["key1"]["key3"] = 234
print(tab.key1.key2) ---> 123
print(tab.key1.key3) ---> 234

求解示例:

我有什么:

tab1 = {"town", "home", 1, "cake"}
value = 1.032
tab2 = {}

我想要什么:

print(tab2.town.home.1.cake) ---> 1.032

【问题讨论】:

    标签: lua


    【解决方案1】:
    local function read_nested_keys(tbl, keys)
       for _, k in ipairs(keys) do
          tbl = tbl[k]
          if tbl == nil then
             break
          end
       end
       return tbl
    end
    
    local function write_nested_keys(value, tbl, keys)
       local prev_tbl, last_k
       for _, k in ipairs(keys) do
          last_k, prev_tbl, tbl = k, tbl, tbl[k]
          if tbl == nil then
             tbl = {}
             prev_tbl[k] = tbl
          end
       end
       prev_tbl[last_k] = value
    end
    

    例子:

    local keys = {"town", "home", 1, "cake"}
    local value = 1.032
    local root = {}
    
    print(read_nested_keys(root, keys)) ---> nil
    
    write_nested_keys(value, root, keys)
    
    print(root.town.home[1].cake)       ---> 1.032
    print(read_nested_keys(root, keys)) ---> 1.032
    

    【讨论】:

      猜你喜欢
      • 2015-04-19
      • 1970-01-01
      • 1970-01-01
      • 2018-09-22
      • 1970-01-01
      • 2015-01-21
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      相关资源
      最近更新 更多