如何在多参数函数上应用函数组合或管道?

How to apply functions composition or pipelines on multi-parameter function?

在一次采访中,我被要求点击 jsonplaceholder /posts 和 /comments 端点并编写一个 returns 将评论与 posts 匹配的函数其中 comment.postId == post.id 然后创建一个完整的 JSON 对象,其中包含属于它的评论中的 post。

我一直在尝试以函数式方法实现它,但找不到处理 2 个数组(2 个输入)的方法,因为管道、组合、转换器都接受一元函数。

我什至想过有两个管道,一个用于处理评论,另一个用于 posts 并在最后加入他们的工作流,但无法实现。

我所能想到的就是将评论本身映射为一个对象数组,其中 postId 作为一个数字代表每个 post 和 comments 作为数组字符串

import axios from 'axios'
import _ from 'ramda'

const { data: comments } = await axios.get(
  'http://jsonplaceholder.typicode.com/comments',
)

const cIds = (comments) =>
  _.pipe(
    _.groupBy(_.prop('postId')),
    _.map(_.pluck('body')),
    _.map(_.flatten),
    _.map(_.uniq),
    _.toPairs,
    _.map(_.zipObj(['postId', 'comments'])),
  )(comments)

console.log(cIds(comments))

所以有人知道如何以实用的方式这样做吗?

我想我在问题中遗漏了一些东西。这听起来像是一个相当简单的函数。我可能会这样写:

const consolidate = ([posts, comments]) => 
  posts .map (p => ({
    ...p,
    comments: comments .filter (c => c.postId == p.id)
  }))

const fullPosts = (postUrl, commentUrl) => 
  Promise .all ([axios .get (postUrl), axios .get (commentUrl)]) 
    .then (consolidate)

fullPosts (
  'https://jsonplaceholder.typicode.com/posts',
  'https://jsonplaceholder.typicode.com/comments'
) .then (console .log, console .warn)
.as-console-wrapper {max-height: 100% !important; top: 0}
<script>const axios = {get: (url) => fetch (url) .then (r => r .json ())} // dummy axios</script>

我是 Ramda 的创始人之一,也是 Ramda 的忠实粉丝,但我不知道它在这里提供了多少。