使用多个变量引用 Lua 字典中的子子子字段

Using Multiple Variables to Reference a Sub-Sub-Sub Field in a Lua Dictionary

  1. 我是 Lua 的新手(就像昨天新的一样),所以请多多包涵...
  2. 对于这个问题的复杂性,我深表歉意,但我不知道如何证明我正在尝试做的事情:

我有一个 Lua table 用作字典。元组(?)没有数字索引,但主要使用字符串索引。许多索引实际上与包含更详细信息的子 table 相关,而那些 table 中的一些索引与更多 table 相关——其中一些是三个或四"levels"深

我需要创建一个功能,可以在字典结构中从多个 "levels" 中搜索特定的项目描述,而无需提前知道是哪个 keys/sub-keys/sub-sub-keys 引导我找到它的。我曾尝试使用变量和 for 循环来做到这一点,但是 运行 遇到了使用这些变量动态测试连续两个键的问题。

在下面的示例中,我尝试获取值:

myWarehouselist.Warehouse_North.departments.department_one["rjXO./SS"].item_description

但是由于我事先不知道我是在 "Warehouse_North" 中查找,还是在 "department_one" 中查找,我 运行 通过这些使用变量的替代方法,搜索特定项目 ID "rjXO./SS",因此对该值的引用最终如下所示:

myWarehouseList[warehouse_key].departments[department_key][myItemID]...?

基本上,我遇到的问题是当我需要将两个变量背靠背放入存储在字典级别 N 的值的引用链中时。我似乎无法将其写成 [x][y]、[x[y]]、[x.y] 或 [x].[y]... 我明白在Lua中,x.y与x[y]不同(前者直接通过字符串索引"y"引用一个键,而后者使用存储在变量[=51中的值=],可以是任何东西。)

我尝试了很多不同的方法,但只遇到错误。

有趣的是,如果我使用完全相同的方法,但向具有常量值的字典添加额外的 "level",例如 ["items"](在每个特定部门下),它允许我毫无问题地引用该值,我的脚本 运行 很好...

myWarehouseList[warehouse_key].departments[department_key].items[item_key].item_description

Lua 语法应该是这样的吗?我已经更改了 table 结构以在每个部门下包含额外的 "items" 层,但这似乎是多余且不必要的。是否可以进行语法更改以允许我在 Lua table 值引用链中背靠背使用两个变量?

在此先感谢您的帮助!

    myWarehouseList = {
        ["Warehouse_North"] = {
             ["description"] = "The northern warehouse"
            ,["departments"] = {
                 ["department_one"] = {
                     ["rjXO./SS"] = {
                         ["item_description"] = "A description of item 'rjXO./SS'"
                     }
                 }
            }
        }
       ,["Warehouse_South"] = {
             ["description"] = "The southern warehouse"
            ,["departments"] = {
                 ["department_one"] = {
                     ["rjXO./SX"] = {
                         ["item_description"] = "A description of item 'rjXO./SX'"
                     }
                 }
            }
       }
    }

    function get_item_description(item_id)
        myItemID = item_id
        for warehouse_key, warehouse_value in pairs(myWarehouseList) do
            for department_key, department_value in pairs(myWarehouseList[warehouse_key].departments) do
                for item_key, item_value in pairs(myWarehouseList[warehouse_key].departments[department_key]) do 
                    if item_key == myItemID
                    then
                        print(myWarehouseList[warehouse_key].departments[department_key]...?)
                        -- [department_key[item_key]].item_description?
                        -- If I had another level above "department_X", with a constant key, I could do it like this:
                        -- print(
                        --  "\n\t" .. "Item ID " .. item_key .. " was found in warehouse '" .. warehouse_key .. "'" ..
                        --  "\n\t" .. "In the department: '" .. dapartment_key .. "'" ..
                        --  "\n\t" .. "With the description: '" .. myWarehouseList[warehouse_key].departments[department_key].items[item_key].item_description .. "'")
                        -- but without that extra, constant "level", I can't figure it out :)
                    else
                    end
                end
            end
        end
    end

如果充分利用循环变量,就不需要那么长的索引链。您似乎只依赖于关键变量,但实际上是值变量拥有您需要的大部分信息:

function get_item_description(item_id)
  for warehouse_key, warehouse_value in pairs(myWarehouseList) do
    for department_key, department_value in pairs(warehouse_value.departments) do
      for item_key, item_value in pairs(department_value) do 
        if item_key == item_id then
          print(warehouse_key, department_key, item_value.item_description)
        end
      end
    end
  end
end

get_item_description'rjXO./SS'
get_item_description'rjXO./SX'