Lua - fusionner les tables?
Question
Je dois fusionner deux tables, avec le contenu du second contenu dans le écrasement d'abord si un élément donné est à la fois. Je regardais mais les bibliothèques standard ne semble pas offrir cela. Où puis-je obtenir une telle fonction?
La solution
for k,v in pairs(second_table) do first_table[k] = v end
Autres conseils
Voici ce que je suis venu avec basé sur 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
Ne serait pas ce travail 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
Pour la fusion de la table numérique-index:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
Voici la version itérative pour la fusion profonde parce que je n'aime pas la pile potentiel de trop-pleins récursive.
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 réponse de Doug Currie est le plus simple pour la plupart des cas. Si vous avez besoin de plus robuste fusion de tables, pensez à utiliser la merge()
méthode 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
-- }
Je préférais la version James pour sa simplicité et l'utiliser dans mon utils.lua -. Je l'ai fait ajouter un chèque pour le type de table pour le traitement des erreurs
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
Merci pour cette belle fonction qui devrait faire partie de la classe de table pour que vous puissiez appeler a:merge(b)
mais faire table.merge = function(a, b) ...
ne fonctionnait pas pour moi. Pourrait même être comprimé à une doublure pour les vrais nerds:)
for k,v in pairs(t2) do t1[k] = v end
pour une solution de chaîne