【发布时间】:2010-11-19 23:34:47
【问题描述】:
我需要合并两个表,如果给定项目在两个表中,则第二个表的内容会覆盖第一个表中的内容。我看了,但标准库似乎没有提供这个。我在哪里可以得到这样的功能?
【问题讨论】:
-
没有单一的方法可以做到这一点。您是在比较表中的键还是值?键/值是否可以是其他表?...
-
我不需要任何比较,但我需要子表...
我需要合并两个表,如果给定项目在两个表中,则第二个表的内容会覆盖第一个表中的内容。我看了,但标准库似乎没有提供这个。我在哪里可以得到这样的功能?
【问题讨论】:
for k,v in pairs(second_table) do first_table[k] = v end
【讨论】:
v==second_table,如果是,则指定first_table。表也可以间接引用自己,但这可能是一本书要解决的问题。我只是想把它放在雷达上,所以'nuff说。
这是我根据 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 {})。
这不能正常工作吗?
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
【讨论】:
else 语句。它应该被进一步简化成你在这里所拥有的。
t1[k] or false?
对于数字索引表合并:
for k,v in pairs(secondTable) do table.insert(firstTable, v) end
【讨论】:
pairs不保证按数字顺序返回元素)?除了table.insert 效率低下,见stackoverflow.com/a/15278426/5267751(其他答案另见)
【讨论】:
true 用于联合,false 用于交集。 github.com/stevedonovan/Penlight/blob/master/lua/pl/…
这是深度合并的迭代版本,因为我不喜欢递归的潜在堆栈溢出。
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
【讨论】:
我更喜欢 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
感谢这个不错的函数,它应该是 table 类的一部分,所以你可以调用 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
【讨论】:
for k,v in pairs(t2) do t1[k] = v end
字符串解决方案的关键
【讨论】: