在 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
我希望能够访问和编辑用户生成的 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