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?

52
demandé sur Yu Hao 2009-08-16 07:18:40

8 réponses

for k,v in pairs(second_table) do first_table[k] = v end
78
répondu Doug Currie 2009-08-16 03:29:24

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
17
répondu RCIX 2009-08-27 05:45:13

ç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
10
répondu James 2011-09-19 12:16:48

pour table d'index numérique fusionnant:

for k,v in pairs(secondTable) do table.insert(firstTable, v) end
3
répondu Jimmy liu 2016-03-22 04:07:02

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
2
répondu Oleg V. Volkov 2012-12-17 16:29:54

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
-- }
2
répondu Blackcoat 2015-04-09 12:13:32

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 :)

0
répondu hexerei software 2015-03-18 22:09:17
for k,v in pairs(t2) do t1[k] = v end

pour la chaîne de solution

0
répondu TimChang 2015-11-05 10:10:56