【发布时间】: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 数组我自己无法实现。
标签: javascript typescript functional-programming ramda.js