将字典中的键值应用到字典

问题描述 投票:0回答:1

标题说明了一切。我想做一个操作,将字典中的键值应用到字典 在这里,我将解释我的意思。

我在代码中初始化了这些长字典。

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
    }
}

这么简单的操作我该如何做?

lua luau
1个回答
2
投票

功能:

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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.