Lua - fusionieren Tabellen?
Frage
Ich brauche zwei Tabellen zu verschmelzen, mit dem Inhalt des zweiten Überschreiben Inhalts in dem ersten, wenn ein bestimmtes Element in beide ist. Ich sah aber die Standard-Bibliotheken scheinen nicht das bieten. Wo finde ich eine solche Funktion?
Lösung
for k,v in pairs(second_table) do first_table[k] = v end
Andere Tipps
Hier ist, was ich mit basierend auf Doug Currie Antwort kam:
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
Wäre das nicht richtig funktioniert?
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
Bei numerischer Indextabelle Verschmelzung:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
Hier sind iterative Version für Deep-Merge, weil ich nicht möglichen Stapelüberlauf der rekursiven mag.
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
Doug Currie Antwort ist die einfachste für die meisten Fälle. Wenn Sie robustere Verschmelzen von Tabellen benötigen, sollten Sie die Verwendung von merge()
Methode aus der Penlight Bibliothek.
require 'pl'
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))
-- {
-- a = 1,
-- d = 4,
-- c = 3,
-- b = 2
-- }
I James-Version für seine Einfachheit bevorzugt und es in meinem utils.lua verwenden -. Ich habe einen Scheck für Tabellentyp zur Fehlerbehandlung hinzufügen
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
Vielen Dank für diese nette Funktion, die Teil der Tabellenklasse sein sollte, so dass Sie a:merge(b)
nennen könnte aber table.merge = function(a, b) ...
tun für mich nicht funktioniert hat. Könnte sogar zu einem Einzeiler für die wirklichen Nerds komprimiert werden:)
for k,v in pairs(t2) do t1[k] = v end
für String-Lösung