javascript - 对数组执行函数列表

标签 javascript functional-programming ramda.js

我正在开始掌握使用函数式编程,而不仅仅是一两个简单的 map 。我遇到一种情况,我希望能够根据这些对象的特定字段从对象数组中过滤一些元素。这是一个人为的例子,但这里是:

我有一个字段定义列表,我想根据标题提取其中两个。

const toSearch = [
  { title: "name", description: "Their name" },
  { title: "age", description: "Their age" },
  { title: "gender", description: "Their gender" }
]

const fieldsToFind = ["name", "age"]
let filterObjects = R.map(R.objOf('title'), fieldsToFind)
let filterFuncs = R.map(R.whereEq(R.__), filterObjects)
let found = R.map(R.filter, filterFuncs)

console.log("Filter objects:", JSON.stringify(filterObjects))
console.log("Filter functions:", JSON.stringify(filterFuncs))

console.log("Found:", found[0](toSearch))
console.log("Found:", found[1](toSearch))

如果我运行这个,最后的输出是我正在寻找的 toSearch 的两个元素,但它并不完全整洁。我一直在尝试让另一个 map 来解决手动执行 found 元素的问题,但我也觉得即使到了这一点,我也采取了过于迂回的方式路线。

虽然这是一个人为的示例,但是否有一种更简洁的方法可以以函数式风格实现此目的?

最佳答案

一种相当简单的方法是:

R.filter(R.where({R.title: R.contains(R.__, ['name', 'age'])}))(toSearch);
//=> [
//     {"description": "Their name", "title": "name"}, 
//     {"description": "Their age", "title": "age"}
//   ]

或者,等价地,

R.filter(R.where({title: R.flip(R.contains)(['name', 'age'])}))(toSearch);

一个优势,特别是当您将相关函数从 R 导入到您的作用域时,是它与您的问题域的读取程度:

var myFunc = filter(where({title: contains(__, ['name', 'age'])}));

myFunc = filter where the title contains 'name' or 'age'.

您可以在 Ramda REPL 上看到此操作的实际效果。

关于javascript - 对数组执行函数列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35937905/

相关文章:

javascript - react-native package 指定了一个主模块 https 模块

javascript - 更改 $( function() ) 名称

node.js - 带有 ramda 和 ramda-fantasy 的 Monadic IO

javascript - 如何在 TypeScript 中通用类型变量绑定(bind)?

javascript - 为什么我的 Ramda 管道功能不能与过滤器一起使用?

javascript - 如何将数组对象转换为对象

javascript - 如何使用jquery下载文件?

.net - F#中的Seq.map和Seq.collect之间的区别

java - Scala 不可变 Map 慢

javascript - 如何在 redux saga 中测试功能选择器?