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?

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top