我需要合并两个表格,如果某个项目在两个表格中都存在,第二个表格的内容将覆盖第一个表格的内容。我寻找了一下,但标准库好像没有提供这样的功能。请问在哪里可以获取此类函数?
for k,v in pairs(second_table) do first_table[k] = v end
dict.update()
。 - Tomasz Gandorv==second_table
,如果是,则分配first_table
。表格也可以间接地引用自身,但这可能需要解决一本书的问题。我只是想把这个放在雷达上,所以说得够了。 - Aiken Drum根据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
tableMerge(t1[k] or {}, t2[k] or {})
会将t2合并到一个新表中,然后丢弃该表。也许应该改为 t1[k] = tableMerge(t1[k] or {}, t2[k] or {})
。 - idbrii这个代码不应该正常工作吗?
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
t1[k] or false
吗? - what the对于数字索引表的合并:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
true
表示联合,false
表示交集。https://github.com/stevedonovan/Penlight/blob/master/lua/pl/tablex.lua#L554 - Blackcoatlocal 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
我喜欢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) ...
对我来说不起作用。甚至可以压缩为一行代码给真正的极客 :)像Doug Currie所说,你可以使用他的函数,但他的方法存在问题。如果first_table
在其k
索引中有内容,则该函数将覆盖它。
我假设您正在尝试合并这些表格,而不是覆盖索引和值。因此,这将是我的方法,它非常类似,但用于合并表格。
for _, v in pairs(second_table) do table.insert(first_table, v) end
这个解决方案唯一的问题是索引设置为数字,而不是字符串。这将适用于索引为数字的表,对于索引为字符串的表,请使用Doug Currie的方法。
for k,v in pairs(second_table) do first_table[k] = v end
v
并自动递增编号,对吗? - VimNing在扩展这个很棒的答案https://dev59.com/A3M_5IYBdhLWcg3wp1Cl#1283399的基础上,我想采用一个(纯)函数式方法,就像下面这个例子:
-- example values
local t1 = { a = 0, b = 2 }
local t2 = { a = 1, c = 3 }
-- merge function that takes functional approach
local merge = function(a, b)
local c = {}
for k,v in pairs(a) do c[k] = v end
for k,v in pairs(b) do c[k] = v end
return c
end
-- t1 and t2 value still same after merge
print(merge(t1, t2)) -- { a = 1, b = 2, c = 3 }
print(t2) -- { a = 1, c = 3 }
print(t1) -- { a = 0, b = 2 }
for k,v in pairs(t2) do t1[k] = v end
字符串解决方案的关键