92 votes

Lua - fusionner les tables?

J'ai besoin de fusionner deux tables, avec le contenu du deuxième contenu écrasant dans le premier si un élément donné est dans les deux. J'ai regardé mais les bibliothèques standard ne semblent pas offrir cela. Où puis-je obtenir une telle fonction?

129voto

Doug Currie Points 26016
for k,v in pairs(second_table) do first_table[k] = v end

24voto

RCIX Points 12049

Voici ce que je propose à partir de la réponse 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
 

14voto

James Points 61

Cela ne fonctionnerait-il pas correctement?

 
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
 

5voto

Oleg V. Volkov Points 9724

Voici la version itérative pour la fusion en profondeur car je n'aime pas les débordements de pile potentiels de récursif.

 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
 

5voto

Blackcoat Points 1412

La réponse de Doug Currie est la plus simple dans la plupart des cas. Si vous avez besoin d'une fusion plus robuste des tables, envisagez d'utiliser la méthode merge() de la bibliothèque Penlight .

 require 'pl'
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))

-- {
--   a = 1,
--   d = 4,
--   c = 3,
--   b = 2
-- }
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X