如何合并两个表,覆盖交集部分的元素?
2021-8-18 14:27:0
收藏:0
阅读:1072
评论:10
我需要合并两个表格,如果某个项目在两个表格中都存在,则第二个表格中的内容会覆盖第一个表格中的内容。我查看了标准库,但似乎没有提供这样的函数。我在哪里可以找到这样的功能呢?
原文链接 https://stackoverflow.com/questions/1283388
点赞
stackoverflow用户33252
2009-08-16 03:29:24
stackoverflow用户117069
根据 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
2009-08-16 06:26:35
stackoverflow用户952644
这个函数不正常吗?
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
2011-09-19 12:16:48
stackoverflow用户936986
下面是用迭代的方式实现深度合并的版本,因为我不喜欢使用递归可能会导致栈溢出。
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
2012-12-17 16:29:54
stackoverflow用户269746
Doug Currie 的回答对于大部分情况都是最简单的。如果你需要更强大的表格合并功能,请考虑使用 Penlight 库中的 merge()
方法。
require 'pl'
pretty.dump(tablex.merge({a=1,b=2}, {c=3,d=4}, true))
-- {
-- a = 1,
-- d = 4,
-- c = 3,
-- b = 2
-- }
2014-05-27 14:03:28
stackoverflow用户1988084
我喜欢简单的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
感谢这个好用的函数,它应该是表类的一部分,这样你就可以调用 a:merge(b)
,但做成 table.merge = function(a, b) ...
对我没用。甚至可以压缩成一行代码,真正的极客们就行了:)
2015-03-18 22:09:17
stackoverflow用户4139780
对于`t2`中的每一对`key-value`,将其赋值给`t1`。
2015-11-05 10:10:56
stackoverflow用户1063398
对于数字索引表的合并:
对于 secondTable 中的每个键值对 k, v ,执行 table.insert(firstTable, v) 操作。
2016-03-22 04:07:02
stackoverflow用户13065801
像 Doug Currie 所说的,你可以使用他的函数,但他的方法存在一个问题。如果 first_table
中的 k
索引有内容,函数将覆盖它。
我假设你正在尝试合并这些表格,而不是覆盖索引和值。因此,以下是我的方法,它非常相似,但用于合并表格。
for _, v in pairs(second_table) do table.insert(first_table, v) end
_这种解决方案唯一的问题是索引是数字,而不是字符串。_这将适用于索引为数字的表格,对于索引为字符串的表格,请使用 Doug Currie 的方法。
Doug Currie 的方法:
for k,v in pairs(second_table) do first_table[k] = v end
2021-01-06 17:25:24
stackoverflow用户1570165
扩展这个好的回答,https://stackoverflow.com/a/1283399/1570165,我想用以下的(纯)函数式方法:
-- 示例值
local t1 = { a = 0, b = 2 }
local t2 = { a = 1, c = 3 }
-- 合并函数采用函数式方法
local merge = function(a, b)
local c = {}
for k,v in pairs(a) do c[k] = v end
for k,v in pairs(b) do c[k] = v end
return c
end
-- 在合并后,t1和t2的值仍然相同
print(merge(t1, t2)) -- { a = 1, b = 2, c = 3 }
print(t2) -- { a = 1, c = 3 }
print(t1) -- { a = 0, b = 2 }
2022-03-11 03:51:19
评论区的留言会收到邮件通知哦~
推荐文章
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
- 如何编写 Lua 模式将字符串(嵌套数组)转换为真正的数组?