在 Lua 中编辑具有不确定维度的多维 table

Editing multidimensional table with uncertain dimensions in Lua

我希望能够访问和编辑用户生成的 table 中的值,它可以有任意数量的维度。

说,对于这个嵌套 table,

table = {
    '1',
    {
        '2.1',
        '2.2'
    },
    {
        {
            '3.1.1',
            '3.1.2'
        },
        '3.2'
    },
}

我会有另一个 table 包含所需数据的位置,

loc = {3, 1, 2}

理想情况下,我想要的是不仅能够访问而且能够编辑 table 中的值,类似于使用 table[3][1][2],但通过利用 loc table,

print(table[loc[1]][loc[2]][loc[3]]) --returns 3.1.2
print(table[loc]) --hypothetically something like this that takes each indexed member of the table in order

我也希望能够编辑这个table。

table[loc] = {'3.1.2.1', '3.1.2.2'}

我需要能够编辑全局 table,所以无法使用 this reddit thread, 中列出的方法,也未能找到正确的方法来使用 metatable ] 还没有。感谢您的帮助,谢谢。

我认为您可以为此目的简单地编写一个附加函数。

function TreeGetValue (Tree, Location)

  local CorrectTree = true
  local Index       = 1
  local Dimensions  = #Location
  local SubTable    = Tree
  local Value

  -- Find the most deep table according to location
  while (CorrectTree and (Index < Dimensions)) do
    local IndexedValue = SubTable[Location[Index]]
    if (type(IndexedValue) == "table") then
      SubTable = IndexedValue
      Index    = Index + 1
    else
      CorrectTree = false
    end
  end

  -- Get the last value, regarless of the type
  if CorrectTree then
    Value = SubTable[Location[Index]]
  end
  
  return Value
end

在这里,我们假设树的开头格式正确。如果我们发现任何问题,我们将标志 CorrectTree 设置为 false 以便立即停止。

我们需要确保在每个维度都有一个 table,以便从中索引一个值。

> TreeGetValue(table, loc)
3.1.2

显然,写set函数也很容易:

function TreeSetValue (Tree, Location, NewValue)

  local Index      = 1
  local Dimensions = #Location
  local SubTable   = Tree

  -- Find the most deep table according to location
  while (Index < Dimensions) do
    local IndexedValue = SubTable[Location[Index]]

    -- Create a new sub-table if necessary
    if (IndexedValue == nil) then
      IndexedValue = {}
      SubTable[Location[Index]] = IndexedValue
    end

    SubTable = IndexedValue
    Index    = Index + 1
  end

  -- Set or replace the previous value
  SubTable[Location[Index]] = NewValue
end

然后用你的测试数据来测试它:

> TreeGetValue(table, loc)
3.1.2
> TreeSetValue(table, loc, "NEW-VALUE")
> TreeGetValue(table, loc)
NEW-VALUE