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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top