如何使用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
相关产品推荐
相关产品推荐

