标题说明了一切。我想做一个操作,将字典中的键值应用到字典 在这里,我将解释我的意思。
我在代码中初始化了这些长字典。
local globalDefault = {
["LastPlayed"] = "",
["Grades"] = {
["Grade"] = 1,
["Level"] = 1
},
["Challenge"] = {
["History"] = {}
},
["Settings"] = {
["ScrollFrameHitbox"] = false
}
}
local globalData = {
["Settings"] = {
["ScrollFrameHitbox"] = true
}
}
我想将
globalData
的所有键值应用到 globalDefault
。
这就是 globalDefault
字典应用后的样子:
{
["LastPlayed"] = "",
["Grades"] = {
["Grade"] = 1,
["Level"] = 1
},
["Challenge"] = {
["History"] = {}
},
["Settings"] = {
["ScrollFrameHitbox"] = true
}
}
这么简单的操作我该如何做?
功能:
function deepApply (default, new)
for key, value in pairs (new) do
if type (value) == "table" then
if not default[key] then
default[key] = {}
print ('created table ['..key..']')
end
local def2 = default[key]
local new2 = new[key]
deepApply (def2, new2)
elseif default[key] ~= new[key] then
print ('updated ['..key..'] from ['..tostring(default[key])..'] to ['..tostring(new[key])..']')
default[key] = new[key]
end
end
end
示例:
local globalDefault = {
["LastPlayed"] = "",
["Grades"] = {
["Grade"] = 1,
["Level"] = 1
},
["Challenge"] = {
["History"] = {}
},
["Settings"] = {
["ScrollFrameHitbox"] = false
}
}
local globalData = {
["Settings"] = {
["ScrollFrameHitbox"] = true
},
["NewSettings"] = {
["IsFun"] = true
},
}
deepApply (globalDefault, globalData)
serpent = require ('serpent')
print (serpent.block (globalDefault))
结果:
created table [NewSettings]
updated [IsFun] from [nil] to [true]
updated [ScrollFrameHitbox] from [false] to [true]
{
Settings = {
ScrollFrameHitbox = true
},
Challenge = {
History = {}
},
NewSettings = {
IsFun = true
},
LastPlayed = "",
Grades = {
Level = 1,
Grade = 1
}
}