Lua - fusionar las tablas?
Pregunta
Necesito combinar dos tablas, con el contenido de la segunda contenidos sobreescritura en el primer caso de un elemento dado es en ambos. Miré, pero no parecen las bibliotecas estándar para ofrecer esto. ¿Dónde puedo conseguir tal función?
Solución
for k,v in pairs(second_table) do first_table[k] = v end
Otros consejos
Esto es lo que ocurrió con base en la respuesta 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
¿No sería este trabajo correctamente?
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
En la tabla numérica-índice de fusión:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
Aquí está la versión iterativa de fusión profunda, porque no me gusta posibles desbordamientos de pila 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
Yo prefería la versión de James por su sencillez y lo uso en mi utils.lua -. Hice añadir un cheque por tipo de tabla de gestión de errores
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
Gracias por esta función agradable que debería formar parte de la clase mesa de modo que se podría llamar a:merge(b)
pero haciendo table.merge = function(a, b) ...
no funcionaba para mí. Incluso podría ser comprimido a un chiste para los empollones reales:)
for k,v in pairs(t2) do t1[k] = v end
clave para la solución de cadena