如何在多参数函数上应用函数组合或管道?
Posted
技术标签:
【中文标题】如何在多参数函数上应用函数组合或管道?【英文标题】:How to apply functions composition or pipelines on multi-parameter function? 【发布时间】:2021-12-28 20:40:47 【问题描述】:在一次采访中,我被要求点击 jsonplaceholder
/posts 和 /cmets 端点并编写一个函数,该函数返回匹配的 cmets 与 comment.postId == post.id
的帖子,然后创建一个包含 cmets 内帖子的整个 JSON 对象属于它。
我一直在尝试以函数式方法实现它,但找不到处理 2 个数组(2 个输入)的方法,因为管道、组合、转换器都接受一元函数。
我什至想过有两个管道,一个用于处理 cmets,另一个用于发布,最后加入他们的工作流,但无法实现。
我能想到的只是将 cmets 本身映射为一个对象数组,其中 postId
作为代表每个帖子的数字,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))
那么有人知道如何以实用的方式做到这一点吗?
【问题讨论】:
这里的“以功能方式”是什么意思?对我来说,这意味着使用纯函数,不改变数据,不产生副作用(以及其他一些事情)。您在寻找无点解决方案吗?如果是这样,我建议应该稍后,一旦你有工作代码,然后根本不要,除非它使代码更具可读性。 正如您所描述的那样,我试图通过制作纯函数或更确切地说是产生预期输出的函数管道来实现它,但我很困惑如何使用这两个函数据我所知,输入,函数组合,管道只适用于一元函数,而不是二进制函数。不,我不是在寻找一个无点的解决方案(还),正如你所建议的那样,我只是想让它按预期工作。 高度相关的Q&A 我已经理解了柯里化和合成的想法,但我正在考虑一种方法——如果可能的话——在数组 X 上创建一个管道,并且输出可以通过管道传输到另一个正在处理的管道数组 Y 并像 [X, Y] 那样对输入进行一些计算,也许第二个管道的输出可以是一个 Z 数组我自己无法实现。 【参考方案1】:我想我在问题中遗漏了一些东西。这听起来像是一个相当简单的功能。我可能会这样写:
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 的创始人之一,也是我的忠实粉丝,但我不知道它在这里提供了什么。
【讨论】:
您的答案当然可以解决它并产生我试图获得的输出,但我认为 - 正如你所提到的 - 你错过了问题的一部分,我的意图是使用管道或我现在正在练习函数组合。以上是关于如何在多参数函数上应用函数组合或管道?的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript ES6函数式编程:柯里化偏应用组合管道
如何在 scikit-learn 中使用管道调整自定义内核函数的参数