在数组上执行函数列表
Executing a list of functions on an array
我正在掌握使用函数式编程,而不仅仅是简单的一两个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 = 标题包含"名称"或"年龄"的过滤器。
你可以在Ramda REPL上看到这一点。
我有一个情况,我希望能够过滤一些元素 从对象数组中,基于这些对象的特定字段 对象。
对于您的情况,它非常简单
var filteredItems = toSearch.filter(function(value){ return fieldsToFind.indexOf(value.title) != -1 });
您可以使用
.reduce
来完成任务。MDN 对 reduce 函数有一个非常简短的解释
相关文章:
- Javascript通过列表项的函数和css来更改背景颜色
- 正在执行函数列表jquery
- 在数组上执行函数列表
- Javascript 动态创建一个函数列表
- Javascript:给定函数列表,如何创建一个将这些函数作为属性的对象
- CouchDB:Erlang 函数列表
- 用函数列表敲除foreach
- 可能调用的自定义函数列表
- 如何使用jEdit获取JavaScript文件的函数列表's Mac上的Sidekick
- node.js:将一个异步函数列表应用于列表列表中的每一项
- 通过函数名称执行函数列表
- 如何正确地按顺序调用异步函数列表
- 从eval中获取函数列表
- 是否有ide给出php内部的js函数列表
- JavaScript:连续调用对象上的函数列表
- jQuery(窗口)的可用函数列表
- 在java中使用scriptenengine,我如何提取函数列表
- 原型中的函数列表
- JavaScript中位运算符的克隆函数列表
- 使用RHINO API在Java中提取js文件中的函数列表