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

如何使用Ramda从对象数组中提取多个指定属性

合并Ramda提取逻辑到单个Pipe中

我有如下结构的对象数组:

const nodes = [
 {
    "id": "0",
    "outgoingNodeIds": ['1', '2'],
    "outgoingVirtualNodes": [
        {
            "virtualNodeId": "5",
        },
        {
            "virtualNodeId": "10",
        }
    ],
 }
]

需要完成两个提取操作并合并结果:

  • 提取所有outgoingNodeIds数组,合并为单个字符串数组
  • 从outgoingVirtualNodes数组中提取所有virtualNodeId值,合并为单个字符串数组

目前我能分开提取后再合并:

const prop1 = R.pipe(
    R.pluck('outgoingNodeIds'),
    R.flatten
)(nodes)

const prop2 = R.pipe(
    R.pluck('outgoingVirtualNodes'),
    R.map(R.pluck('virtualNodeId')),
    R.flatten
)(nodes)

R.concat(prop1, prop2)

但我想把这些逻辑整合到单个pipe里,不知道怎么在同时获取两个属性的前提下,对第二个属性做映射提取virtualNodeId,求解决方案。


解决方案1:使用R.converge合并逻辑

R.converge可以同时运行多个提取分支,最后将分支结果传给合并函数(这里用R.concat):

const getAllOutgoingIds = R.pipe(
  R.converge(R.concat, [
    // 提取并扁平化outgoingNodeIds
    R.pipe(R.pluck('outgoingNodeIds'), R.flatten),
    // 提取virtualNodeId并扁平化
    R.pipe(R.pluck('outgoingVirtualNodes'), R.map(R.pluck('virtualNodeId')), R.flatten)
  ])
)

// 调用结果
getAllOutgoingIds(nodes) // ['1', '2', '5', '10']

解决方案2:用R.chain简化虚拟节点提取

R.chain可以替代map+flatten的组合,让代码更简洁:

const getAllOutgoingIds = R.pipe(
  R.converge(R.concat, [
    R.pipe(R.pluck('outgoingNodeIds'), R.flatten),
    R.pipe(R.pluck('outgoingVirtualNodes'), R.chain(R.pluck('virtualNodeId')))
  ])
)

解决方案3:按节点遍历合并(更直观)

直接遍历每个节点,合并当前节点的两类ID,再通过R.chain自动扁平化所有结果:

const getAllOutgoingIds = R.pipe(
  R.chain(node => [
    ...node.outgoingNodeIds,
    ...R.pluck('virtualNodeId', node.outgoingVirtualNodes)
  ])
)

内容的提问来源于stack exchange,提问作者omygoodness

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:40:26