如何用Ramda优雅合并同结构数组?求指定合并深度方案
基于Ramda实现指定深度的数组结构合并
针对当前两层嵌套场景的简洁实现
你的现有代码通过嵌套map实现了两层数组中对应位置对象的合并,用Ramda可以用zipWith组合简化逻辑:
import * as R from 'ramda' // ... 保留原expected、t1、t2定义 ... test('merge with Ramda', () => { const merged = R.zipWith(R.zipWith(R.mergeRight), t1, t2) expect(merged).toStrictEqual(expected) })
R.zipWith会遍历两个数组的对应元素,用传入的函数处理每一对元素- 两层
zipWith对应两层数组嵌套,最内层用R.mergeRight合并对应位置的对象(后者对象的属性覆盖前者,这里因结构互补刚好合并成完整对象)
通用的指定深度合并方案
如果需要支持任意指定层级的嵌套数组合并,可以写一个递归的Ramda风格函数:
const mergeDeepN = (depth) => { const merge = R.cond([ // 处理层级未耗尽且当前为数组时,递归处理下一层 [R.both(R.is(Array), () => depth > 0), R.zipWith(mergeDeepN(depth - 1))], // 当前为对象时,合并属性 [R.is(Object), R.mergeRight], // 其他类型直接返回原数据 [R.T, R.identity] ]) return merge }
使用时指定嵌套深度即可(你的场景深度为2):
test('merge with custom depth', () => { const merged = mergeDeepN(2)(t1, t2) expect(merged).toStrictEqual(expected) })
注意事项
- 该方案假设两个输入的数组结构完全一致(嵌套层级、各层数组长度匹配),
R.zipWith会以较短的数组长度为准,超出部分会被忽略 - 如果需要处理结构不完全匹配的场景,可以调整逻辑替换
R.zipWith为R.zipWithAll或自定义数组遍历逻辑
内容的提问来源于stack exchange,提问作者Jean-Baptiste Quenot
相关产品推荐
相关产品推荐

