Lua - 合并表?

时间:2009-08-16 03:18:41

标签: merge lua lua-table

我需要合并两个表,如果给定的项目同时存在,则第二个覆盖内容将包含在第一个表中。我看了,但标准库似乎没有提供这个。我在哪里可以获得这样的功能?

9 个答案:

答案 0 :(得分:83)

for k,v in pairs(second_table) do first_table[k] = v end

答案 1 :(得分:18)

根据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

答案 2 :(得分:10)

这不能正常工作吗?


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

答案 3 :(得分:4)

对于数字索引表合并:

for k,v in pairs(secondTable) do table.insert(firstTable, v) end

答案 4 :(得分:2)

这是深度合并的迭代版本,因为我不喜欢递归的潜在堆栈溢出。

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

答案 5 :(得分:2)

对于大多数情况,Doug Currie的回答是最简单的。如果您需要更强大的表合并,请考虑使用merge()库中的Penlight方法。

require 'pl'
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))

-- {
--   a = 1,
--   d = 4,
--   c = 3,
--   b = 2
-- }

答案 6 :(得分:1)

就像Doug Currie说的,你可以使用他的功能,但是他的方法有问题。如果 first_tablek 索引中有内容,该函数将覆盖它。

我假设您正在尝试合并这些表,而不是覆盖索引和值。所以这将是我的方法,它非常相似,但用于合并表。

for _, v in pairs(second_table) do table.insert(first_table, v) end

这个解决方案的唯一问题是索引被设置为数字,而不是字符串。这适用于以数字为索引的表,对于以字符串为索引的表,请使用 Doug Currie 的方法。

Doug Currie 的方法:

for k,v in pairs(second_table) do first_table[k] = v end

答案 7 :(得分:0)

我更喜欢James版本的简单性,并在我的utils.lua中使用它 - 我确实添加了一个表格类型的检查以便进行错误处理。

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

感谢这个很好的函数,它应该是表类的一部分,所以你可以调用a:merge(b),但是table.merge = function(a, b) ...对我来说不起作用。甚至可以压缩为真正的书呆子一个班轮:)

答案 8 :(得分:0)

for k,v in pairs(t2) do t1[k] = v end

字符串解决方案的关键