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

如何在Lua中实现类似JavaScript对象展开的表合并功能?

Lua 实现类似 JavaScript 的表合并方法

Lua 本身没有像 JavaScript 扩展运算符(...)那样的原生语法直接合并表,但可以通过几种简洁的方式实现相同的效果,分场景说明:

1. 基础浅合并(哈希表/键值对表)

如果要合并的是带自定义键的表(类似 JS 对象),最直接的方式是遍历赋值:

方式一:合并到已有表

local obj1 = {a=1, b='blue', c=true}
local obj2 = {d=3, e='something else'}

-- 将 obj1 的所有键值对拷贝到 obj2
for k, v in pairs(obj1) do
    obj2[k] = v
end
-- 此时 obj2 包含 obj1 的所有属性 + 自身原有属性

方式二:创建新表合并

如果不想修改原有表,可以创建一个新表来存储合并结果:

local obj1 = {a=1, b='blue', c=true}
local obj2 = {d=3, e='something else', b='red'} -- 同键会被后面的表覆盖

local merged = {}
-- 先拷贝 obj1 的内容
for k, v in pairs(obj1) do merged[k] = v end
-- 再拷贝 obj2 的内容(同键会覆盖之前的)
for k, v in pairs(obj2) do merged[k] = v end

-- merged 结果:{a=1, b='red', c=true, d=3, e='something else'}

2. 通用合并函数

可以封装一个复用的合并函数,支持合并多个表:

function merge(...)
    local result = {}
    -- 遍历传入的所有表
    for _, tbl in ipairs({...}) do
        for k, v in pairs(tbl) do
            result[k] = v
        end
    end
    return result
end

-- 使用示例
local obj1 = {a=1, b='blue'}
local obj2 = {c=true, d=3}
local obj3 = {b='green', e='test'}
local final = merge(obj1, obj2, obj3)
-- final 结果:{a=1, b='green', c=true, d=3, e='test'}

3. 数组型表的合并

如果是整数索引的数组表,可以用 table.move 高效合并(Lua 5.1+ 支持):

local arr1 = {1, 2, 3}
local arr2 = {4, 5, 6}

-- 合并到新数组
local arr3 = {}
table.move(arr1, 1, #arr1, 1, arr3)
table.move(arr2, 1, #arr2, #arr3 + 1, arr3)
-- arr3 结果:{1,2,3,4,5,6}

-- 或者直接合并到 arr2 末尾
table.move(arr1, 1, #arr1, #arr2 + 1, arr2)

注意事项

以上所有方法都是浅合并:如果表中包含嵌套的子表,只会拷贝子表的引用,不会递归复制子表内部的内容。如果需要深合并,需要自行实现递归遍历的逻辑。

内容的提问来源于stack exchange,提问作者RobKohr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 19:25:21