在数组上执行函数列表

时间:2016-03-11 10:34:36

标签: javascript functional-programming ramda.js

我正在努力使用超出简单map或2的函数式编程。我有一种情况,我希望能够根据这些对象的特定字段过滤对象数组中的某些元素。这是一个人为的例子,但这里有:

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

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个元素,但我也觉得即使在这一点上我也采取了过于迂回的路线。

虽然这是一个人为的例子,但是有一种更简洁的方式来实现这一功能吗?

3 个答案:

答案 0 :(得分:2)

这样做的一个相当简单的方法是:

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 上看到这一点。

答案 1 :(得分:0)

您可以使用.reduce来完成任务。 MDN对reduce函数有一个非常简短的解释

答案 2 :(得分:0)

  

我有一种情况,我希望能够过滤一些元素   来自一组对象,基于这些对象的特定字段   对象。

根据您的情况,非常简单

var filteredItems = toSearch.filter(function(value){ return fieldsToFind.indexOf(value.title) != -1 });