Lua - mesas de mesclagem?
Pergunta
Eu preciso para mesclar duas tabelas, com o conteúdo do segundo conteúdo Substituições em primeiro, se um determinado item está em ambos. Olhei, mas as bibliotecas padrão parecem não oferecer este. Onde posso obter tal função?
Solução
for k,v in pairs(second_table) do first_table[k] = v end
Outras dicas
Aqui está o que eu vim acima com base na resposta de Doug Currie:
function tableMerge(t1, t2)
for k,v in pairs(t2) do
if type(v) == "table" then
if type(t1[k] or false) == "table" then
tableMerge(t1[k] or {}, t2[k] or {})
else
t1[k] = v
end
else
t1[k] = v
end
end
return t1
end
Não seria este trabalho corretamente?
function merge(t1, t2)
for k, v in pairs(t2) do
if (type(v) == "table") and (type(t1[k] or false) == "table") then
merge(t1[k], t2[k])
else
t1[k] = v
end
end
return t1
end
Para numérico índice da tabela de fusão:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
Aqui está a versão iterativa para merge profunda porque eu não gosto de pilha potencial transborda de recursiva.
local merge_task = {}
function merge_to_left_o(orig, new)
merge_task[orig] = new
local left = orig
while left ~= nil do
local right = merge_task[left]
for new_key, new_val in pairs(right) do
local old_val = left[new_key]
if old_val == nil then
left[new_key] = new_val
else
local old_type = type(old_val)
local new_type = type(new_val)
if (old_type == "table" and new_type == "table") then
merge_task[old_val] = new_val
else
left[new_key] = new_val
end
end
end
merge_task[left] = nil
left = next(merge_task)
end
end
A resposta de Doug Currie é o mais simples para a maioria dos casos. Se você precisar de fusão mais robusto de tabelas, considere usar o merge()
método do biblioteca Penlight .
require 'pl'
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))
-- {
-- a = 1,
-- d = 4,
-- c = 3,
-- b = 2
-- }
Eu preferia versão James por sua simplicidade e usá-lo na minha utils.lua -. I fez adicionar uma verificação para o tipo de mesa para o tratamento de erros
function merge(a, b)
if type(a) == 'table' and type(b) == 'table' then
for k,v in pairs(b) do if type(v)=='table' and type(a[k] or false)=='table' then merge(a[k],v) else a[k]=v end end
end
return a
end
Obrigado por esta função agradável que deve fazer parte da classe mesa para que você poderia chamar a:merge(b)
mas fazer table.merge = function(a, b) ...
não funcionou para mim. Poderia mesmo ser comprimido para um um forro para os nerds reais:)
for k,v in pairs(t2) do t1[k] = v end
chave para solução de corda