merge - una - unir dos listas en excel
Lua-fusionar tablas? (8)
Necesito fusionar dos tablas, con el contenido del segundo contenido sobrescrito en la primera si un elemento dado está en ambos. Miré pero las bibliotecas estándar no parecen ofrecer esto. ¿Dónde puedo conseguir tal función?
¿No funcionaría 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
Aquí está la versión iterativa para la fusión profunda porque no me gustan los posibles desbordamientos de pila de recursivos.
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
Esto es lo que se me ocurrió basado 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
La respuesta de Doug Currie es la más simple para la mayoría de los casos. Si necesita una combinación de tablas más sólida, considere usar el método merge()
de la biblioteca de Penlight .
require ''pl''
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))
-- {
-- a = 1,
-- d = 4,
-- c = 3,
-- b = 2
-- }
Para la combinación de tablas de índices numéricos:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
Preferí la versión de James por su simplicidad y la uso en mis utils.lua; agregué una verificación del tipo de tabla para el manejo 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 buena función que debería ser parte de la clase de tabla para que pueda llamar a:merge(b)
pero hacer table.merge = function(a, b) ...
no funcionó para mí. Incluso se podría comprimir en una sola línea para los nerds reales :)
for k,v in pairs(second_table) do first_table[k] = v end
for k,v in pairs(t2) do t1[k] = v end
clave para la solución de cadena