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?

¿Fue útil?

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

La respuesta de Doug Currie es el más simple para la mayoría de los casos. Si necesita más robusto fusión de las tablas, puede utilizar el merge() método de la 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
-- }

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top