仅当对象存在使用Ramda时才调用对象上的嵌套方法

gos*_*eti 1 javascript functional-programming ramda.js

我目前有一个user对象,它有一个currentRoom()方法,有时可能不存在或返回null.

如果currentRoom()方法返回一些东西,那么我需要调用一个messages()方法.如果从任何一个都没有返回任何内容,我想返回一个默认的空数组[].

我想使用Ramda在功能上解决这个问题,所以它很整洁且可重复使用.目前,我的(非Ramda)代码如下所示:

const user = Users.findOne({ username: params.id })
const room = (user.currentRoom && user.currentRoom() || {})
const messages = (room.messages && room.messages() || [])
Run Code Online (Sandbox Code Playgroud)

我想的某种逻辑是传递所需方法的列表,以及默认结果,如果没有任何结果.

/* getMessages(defaultIfNull, methodsArray, object) */

getMessages([], ['currentRoom', 'messages'], user)
Run Code Online (Sandbox Code Playgroud)

基本上有点类似的东西pathOr,但对于对象上的方法.

Ber*_*rgi 5

我想我会使用Listmonad Option:

const getRoom = user => "currentRoom" in user ? [user.currentRoom()] : [];
const getMessages = room => "messages" in room ? room.messages() : [];

const allTogether = R.compose(R.chain(getMessage), R.chain(getRoom), R.of);
console.log(allTogether(Users.findOne({ username: params.id })));
Run Code Online (Sandbox Code Playgroud)