RCI*_*CIX 56 merge lua lua-table
我需要合并两个表,如果给定的项目同时存在,则第二个覆盖内容将包含在第一个表中.我看了,但标准库似乎没有提供这个.我在哪里可以获得这样的功能?
Dou*_*rie 85
for k,v in pairs(second_table) do first_table[k] = v end
Run Code Online (Sandbox Code Playgroud)
RCI*_*CIX 17
以下是我根据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
Run Code Online (Sandbox Code Playgroud)
小智 11
这不能正常工作吗?
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
Run Code Online (Sandbox Code Playgroud)
小智 6
对于数字索引表合并:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
Run Code Online (Sandbox Code Playgroud)
这是深度合并的迭代版本,因为我不喜欢递归的潜在堆栈溢出。
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
Run Code Online (Sandbox Code Playgroud)
对于大多数情况,Doug Currie 的答案是最简单的。如果您需要更强大的表合并,请考虑使用Penlightmerge()库中的方法。
require 'pl'
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))
-- {
-- a = 1,
-- d = 4,
-- c = 3,
-- b = 2
-- }
Run Code Online (Sandbox Code Playgroud)