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?
Réponses
Trop de publicités?
RCIX
Points
12049
James
Points
61
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
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
-- }