识别表格/变量的变化。

我有几个表/变量(下面是样本):

mytable = { ['100'] = { ['2']=0,['3']=0,['5']=0,['6']=0,['7']=0,['9']=0},
            ['101'] = { ['8']={['81']=0,['86']=0},
                        ['13']={['81']=0},
                        ['30']={['81']=0,['82']=0,['83']=0,['84']=0,['85']=0} },
            ['102'] = { ['81']={['location']='left',['3']=1} }
          }
mytable2 = 5

我需要一个函数来传递一个结构如上述两个之一的表/变量(可以是任何一个),它将区分当前数据和先前数据,并返回一个仅包含上次每个客户端调用后发生变化的数据的表/变量(与表/变量一起传递的唯一ID)。在函数执行之间,表格可以增长或更改。

因此,如果在函数执行之间发生以下更新:

mytable['101']['8']['81']=1
mytable['102']['81']['4']=0

该函数将返回

mytable = { ['101'] = { ['8']={['81']=1} },
            ['102'] = { ['81']={['4']=0} }
          }

原文链接 https://stackoverflow.com/questions/9071459

点赞
stackoverflow用户513763
stackoverflow用户513763

关于 Lua 表格有一个需要注意的问题:表格是通过引用传递的(除非进行深拷贝)。因此,如果你这样做:

A={1,2,3}
B=A
B[1]=nil
--[[then]]
print(A[1]==nil)-- 输出 true。

因此,拥有“新表格”和“旧表格”需要您额外付出一些努力。 要么对表格进行深拷贝以获取引用(不占用位置)。 要么您不直接更改表格本身,而是使用代理。这仅针对单层表格有效,但我认为您可以在代理表格中嵌入结构,并在真实表格中保存值:

mytable={}
do
    local changes={}
    mt={
    __index=function(t,k)
        if k=="reset" then
             return function()
                 changes={}
                 return true
             end
        elseif k=="getChanges" then
             return function() return changes end
        else
             return mytable[k]
        end
    end,
    __newindex=function(t,k,v)
        changes[k]=v
        mytable[k]=v
    end
    }
    prox=setmetatable({},mt)
end
prox[1]=1
prox[2]=2
for k,v in pairs(prox:getChanges()) do print(k,v) end
prox:reset()
for k,v in pairs(prox:getChanges()) do print(k,v) end

递归实现可能需要一些工作。我想您应该考虑一个问题:编写一个简单的函数来记录表格的交易是否会更简单。

2012-01-31 09:01:32
stackoverflow用户88888888
stackoverflow用户88888888

虽然这会增加空键,但我认为这对我有效:

-- t 是表, pt 是上一个表

function deepchange(t,pt)
if (pt == nil) then return t, true end
if type(t) ~= 'table' then return t, t ~= pt end
local res = {}
local sd = false
for k, v in pairs(t) do
    if type(v) == 'table' then v = deepchange(v, pt[k]) end
    if pt ~= nil and pt[k] ~= v or pt == nil then
        res[k] = v
        sd = true
    end
end
return res, sd
end

更新以处理第二种情况和删除与获取和设置元表有关的不必要行...

再次更新以处理 null 的先前表。

2012-02-01 04:58:17