我是函数式编程的新手,我正在尝试在javascript中运行和部分实现的想法,以使我的头脑围绕着它们。目前,我正在努力训练如何传递一个过滤器函数。下面是我在教程中看到的一行
var seperate = arr => key => val => arr.filter(obj => obj[key] === val);假设我想让filter函数成为一个临时参数,这样我就可以通过应用不同的filter函数(例如var isHuman或var isLessThan50等)创建部分实现。
也许我想将其工作的数据集作为部分实现的一个参数传递给var filterMembers(membershipData);,然后我想要进行不同的过滤实现var femaleMembers = filterMembers(isFemaleFilter);,这将是一个array.filter()函数。
怎样才能做到这一点?
编辑:
抱歉,我的提问不太清楚。我希望数组和过滤器是可变的。我希望将函数从部分实现中分离出来。
因此,我可能会创建一个对成员数组工作的部分实现,或者对人口普查数据或其他类似的实现。然后,我想从那些部分实现中组合函数,将不同的过滤器函数传递到在不同数据集中工作的部分实现。
恐怕我不知道如何编写工作代码来演示我的问题。
发布于 2018-02-14 13:00:27
您需要部分实现过滤器函数:
const filter = fn => arr =>
arr.filter(fn)
const members = [
{name: 'eminem', sex: 'male'},
{name: 'rihanna', sex: 'female'}
]
const filter = fn => arr =>
arr.filter(fn)
const isFemale = x =>
x.sex === 'female'
const filterFemaleMembers = filter(isFemale)
console.log(filterFemaleMembers(members))
首先将fn传递给filter比将arr传递给filter更好,因为当您组合函数时,它有一个好处:
const members = [
{name: 'Eminem', sex: 'male'},
{name: 'Rihanna', sex: 'female', age: 28},
{name: 'Lana Del Rey', sex: 'female', age: 31}
]
const filter = fn => arr =>
arr.filter(fn)
const compose = f => g => x =>
f(g(x))
const isFemale = x =>
x.sex === 'female'
const isOlder30 = x =>
x.age > 30
const isFemaleAndOlder30 = compose
(filter (isFemale))
(filter (isOlder30))
console.log(
isFemaleAndOlder30 (members)
)
https://stackoverflow.com/questions/48787212
复制相似问题