如何在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
相关产品推荐
相关产品推荐

