Lua - fusionner les tables?
j'ai besoin de fusionner deux tables, avec le contenu du deuxième contenu de réécriture dans le premier si un élément donné est dans les deux. J'ai regardé, mais les bibliothèques standards ne semblent pas offrir ça. Où puis-je obtenir une telle fonction?
8 réponses
voici ce que J'ai trouvé 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
ça ne marcherait 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
pour table d'index numérique fusionnant:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
Voici la version itérative pour Deep merge parce que je n'aime pas les dépassements de pile potentiels de recursive.
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 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
-- }
j'ai préféré la version James pour sa simplicité et je l'utilise dans mes outils.lua-j'ai ajouté un contrôle pour le type de table pour la gestion 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) ...
n'a pas fonctionné pour moi. Pourrait même être compressé à une doublure pour les vrais nerds :)
for k,v in pairs(t2) do t1[k] = v end
pour la chaîne de solution