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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 04:20:05