Lua - merge tables?
我需要合并两个表,如果给定项目在两个表中,则第二个表的内容将覆盖第一个表的内容。 我看了一下,但标准库似乎没有提供此功能。 在哪里可以获得这样的功能?
1 | for k,v in pairs(second_table) do first_table[k] = v end |
这是我根据道格·柯里(Doug Currie)的回答得出的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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 |
这不能正常工作吗?
1 2 3 4 5 6 7 8 9 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 |
对于数字索引表合并:
1 | for k,v in pairs(secondTable) do table.insert(firstTable, v) end |
道格·柯里(Doug Currie)的答案在大多数情况下是最简单的。 如果需要更强大的表合并,请考虑使用Penlight库中的
1 2 3 4 5 6 7 8 9 | require 'pl' pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true)) -- { -- a = 1, -- d = 4, -- c = 3, -- b = 2 -- } |
这是用于深度合并的迭代版本,因为我不喜欢递归的潜在堆栈溢出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | 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 |
1 | for k,v in pairs(t2) do t1[k] = v end |
字符串解决方案的关键
我更喜欢James版本,因为它简单易用,并在utils.lua中使用它-我确实添加了表类型检查以进行错误处理。
1 2 3 4 5 6 | 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 |
感谢这个很好的函数,它应该是表类的一部分,因此您可以调用