varias unir una tablas sola listas dinamicas concatenar como combinar merge lua lua-table

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