问题背景
业务需求要通过事件触发, 来实现两个 table 的数据合并.
理清了需求和思路并思考下扩展, 记录下来, 用于分享和沉淀.
因为用 lua 写的业务, 所以这里用 lua
实现的.
PS: 在 lua 里 table 和 hash 的结构类似
一层合并
数据
1 | local a = { |
函数
1 | function table.merge(dest, src, cover) |
结果
1 | { |
你看我想将 table B.a.aa.aaa 的值合并到 table A.a.aa.aaa
但是直接用 table B.a 将 table A.a 的值给覆盖了
所以这个函数只能用于一层 hash 函数的合并了
递归合并
数据
1 | local a = { |
函数
1 | function table.r_merge(dest, src, cover) |
结果
1 | { |
table B.a.aa.aaa1 追加到了 table A.a.aa 里面
table B.a.aa.aaa 覆盖了 table A.a.aa.aaa
table B.b.bb 覆盖了 table A.b.aa
table B.c.cc.ccc 覆盖了 table A.c.cc.ccc
层级合并
扩展思考
一层合并和递归合并都不灵活
所以需要有一个提供给调用者想要合并层级的函数
数据
1 | local A = { |
实现
1 | function table.r_merge(dest, src, cover, depth) |
其实我不喜欢这样的函数.
因为在调用的时候就要明确的知道层级的范围是多少.
也就是说层级前和层级后的数据是不同的.
这种结构的不同是隐性存在的.
需要调用者自行把控.
结果
1 | { |
table A.a.bb 添加到了 table A.a
table B.aa 覆盖了 table A.a.aa, A.a.aa.xxx 没有了, 去哪了? ^.^
table A.a.bb 还在 A 里乖乖的呆着.
table B.b.bb 覆盖了 table A.b.bb
table B.c.cc 覆盖了 table A.c.cc