You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 16:49:58