En una entrevista, me pidieron que presionara los puntos finales jsonplaceholder /posts y /comments y escribiera una función que devolviera comentarios coincidentes con publicaciones donde comment.postId == post.id y luego crear un objeto JSON completo que contuviera la publicación dentro de los comentarios. eso.
He estado tratando de implementarlo en un enfoque funcional, pero no puedo encontrar una manera de tratar con 2 matrices (2 entradas) como tuberías, composiciones, transductores, todos aceptan funciones unarias.
Incluso pensé en tener dos canales, uno para procesar los comentarios y otro para las publicaciones y unir sus flujos de trabajo al final, pero no pude implementarlo.
Todo lo que se me ocurrió es mapear los comentarios en sí mismos para que sean una matriz de objetos donde tiene postId como un número que representa cada publicación y comments como una matriz de cadenas.
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))Entonces, ¿alguien tiene una idea de cómo hacerlo de manera funcional?
Creo que me estoy perdiendo algo en la pregunta. Esto suena como una función bastante simple. Podría escribirlo algo como esto:
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>Soy uno de los fundadores de Ramda y un gran admirador, pero no sé si ofrece mucho aquí.