Lua中如何合并两个哈希表?代码错误排查及简化方案
问题分析与解决方案
原代码出错原因
你的代码核心问题在于ListConcat函数会直接修改传入的第一个参数(也就是key1s):
function ListConcat(t1,t2) for i=1,#t2 do t1[#t1+1] = t2[i] end return t1 end
当你执行keys = ListConcat(key1s, key2s)时,key1s会被直接追加key2s的所有元素,变成包含t1和t2所有键的列表。后续has_value(key1s, key)判断时,所有键都会被判定属于t1,于是尝试从t1中取值——但t1并没有t2的键,对应值为nil,而Lua表不会存储nil值,最终结果里就丢失了t2的键值对。
另外,整个实现逻辑过于冗余,完全没必要通过提取键、合并键列表再判断的方式实现哈希表合并。
简便的合并实现方案
方案1:合并到新表(不修改原表)
该方案创建一个新表,将两个原表的键值对全部复制进去,不会修改输入的t1和t2。如果存在重复键,t2的值会覆盖t1的:
function TableConcat(t1, t2) local merged = {} -- 复制t1的所有键值对 for k, v in pairs(t1) do merged[k] = v end -- 复制t2的所有键值对 for k, v in pairs(t2) do merged[k] = v end return merged end
方案2:合并到原表t1(修改原表,节省内存)
如果允许修改原表t1,可以直接将t2的键值对追加到t1中,无需创建新表:
function TableConcat(t1, t2) for k, v in pairs(t2) do t1[k] = v end return t1 end
测试验证
使用你的测试代码验证方案1:
local a = {["a"] = "a"} local b = {["b"] = "b"} local merged = TableConcat(a, b) -- merged 结果为 {["a"] = "a", ["b"] = "b"}
内容的提问来源于stack exchange,提问作者Sapbot SCS
相关产品推荐
相关产品推荐

