给定 table 个键,是否有一种非 hacky 方法来更改嵌套 table 中的值?
Is there a non-hacky way to change a value in a nested table given a table of the keys?
因此,在给定 table 个键
的情况下,我尝试更改嵌套 table 中的值
示例:
local DATA = {
Storage = {
Person_id = {
Money = 0;
Inventory = {
Item1 = 0;
}
}
}
}
local function ChangeData(ID, KeyTable, Value, Operation)
local StorageValue = DATA.Storage[ID].Data;
for _, Key in ipairs(KeyTable) do
StorageValue = StorageValue[Key];
end
if Operation == "+" then
StorageValue = StorageValue + Value;
elseif Operation == "=" then
StorageValue = Value;
end
end
ChangeData("person_id", {"Money"}, 5, "="};
ChangeData("person_id", {"Inventory", "Item1"}, 5, "="};
这成功从嵌套 table 中获取值(并更改变量值),但未更改嵌套 table 中的值。
...
解决此问题的唯一方法 (我真的不想 想这样做) 是对其进行硬编码。
例如:
if Operation == "=" then
if #KeyTable == 1 then
DATA.Storage[ID].Data[KeyTable[1]] = Value;
elseif #KeyTable == 2 then
DATA.Storage[ID].Data[KeyTable[1]][KeyTable[2]] = Value;
--... and so on
所以我要问的是:在给定 table钥匙?
您可以使用 table.remove
删除 table 的最后一个值,并将其保存为最后一个键。
然后您可以按原样使用大部分代码,只需要将最后一个键索引添加到您的操作 if 语句主体中。
local DATA = {
Storage = {
Person_id = {
Money = 0,
Inventory = {
Item1 = 5
}
}
}
}
local function ChangeData(ID, KeyTable, Value, Operation)
local StorageValue = DATA.Storage[ID]
local LastKey = table.remove(KeyTable)
for i, Key in ipairs(KeyTable) do
StorageValue = StorageValue[Key]
end
if Operation == "+" then
StorageValue[LastKey] = StorageValue[LastKey] + Value
elseif Operation == "=" then
StorageValue[LastKey] = Value
end
end
ChangeData("Person_id", {"Money"}, 5, "=")
ChangeData("Person_id", {"Inventory", "Item1"}, 5, "+")
print(DATA.Storage.Person_id.Money)
print(DATA.Storage.Person_id.Inventory.Item1)
此外,如 Egor Skriptunoff 在评论中所述,请务必将 next, KeyTable
更改为 ipairs(KeyTable)
以确保保留您的密钥顺序。
因此,在给定 table 个键
的情况下,我尝试更改嵌套 table 中的值示例:
local DATA = {
Storage = {
Person_id = {
Money = 0;
Inventory = {
Item1 = 0;
}
}
}
}
local function ChangeData(ID, KeyTable, Value, Operation)
local StorageValue = DATA.Storage[ID].Data;
for _, Key in ipairs(KeyTable) do
StorageValue = StorageValue[Key];
end
if Operation == "+" then
StorageValue = StorageValue + Value;
elseif Operation == "=" then
StorageValue = Value;
end
end
ChangeData("person_id", {"Money"}, 5, "="};
ChangeData("person_id", {"Inventory", "Item1"}, 5, "="};
这成功从嵌套 table 中获取值(并更改变量值),但未更改嵌套 table 中的值。
...
解决此问题的唯一方法 (我真的不想 想这样做) 是对其进行硬编码。 例如:
if Operation == "=" then
if #KeyTable == 1 then
DATA.Storage[ID].Data[KeyTable[1]] = Value;
elseif #KeyTable == 2 then
DATA.Storage[ID].Data[KeyTable[1]][KeyTable[2]] = Value;
--... and so on
所以我要问的是:在给定 table钥匙?
您可以使用 table.remove
删除 table 的最后一个值,并将其保存为最后一个键。
然后您可以按原样使用大部分代码,只需要将最后一个键索引添加到您的操作 if 语句主体中。
local DATA = {
Storage = {
Person_id = {
Money = 0,
Inventory = {
Item1 = 5
}
}
}
}
local function ChangeData(ID, KeyTable, Value, Operation)
local StorageValue = DATA.Storage[ID]
local LastKey = table.remove(KeyTable)
for i, Key in ipairs(KeyTable) do
StorageValue = StorageValue[Key]
end
if Operation == "+" then
StorageValue[LastKey] = StorageValue[LastKey] + Value
elseif Operation == "=" then
StorageValue[LastKey] = Value
end
end
ChangeData("Person_id", {"Money"}, 5, "=")
ChangeData("Person_id", {"Inventory", "Item1"}, 5, "+")
print(DATA.Storage.Person_id.Money)
print(DATA.Storage.Person_id.Inventory.Item1)
此外,如 Egor Skriptunoff 在评论中所述,请务必将 next, KeyTable
更改为 ipairs(KeyTable)
以确保保留您的密钥顺序。