如何在多参数函数上应用函数组合或管道?
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 的忠实粉丝,但我不知道它在这里提供了多少。
在一次采访中,我被要求点击 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 的忠实粉丝,但我不知道它在这里提供了多少。