这是使用Ramda的解决方案:
const {curry, contains, __, where, filter} = R; // Ramda
const search = curry(function (statuses, emailMatch, list) {
const email = contains(emailMatch);
const status = contains(__, statuses);
return filter(where({email, status}), list);
});
const userList = [
{email: 'john@stackoverflow.com', status: 'ACTIVE'},
{email: 'david@gmail.com', status: 'ACTIVE'},
{email: 'peter@gmail', status: 'INACTIVE'},
{email: 'tom@stackoverflow.com', status: 'INACTIVE'}
];
const searchActiveUsers = search(['ACTIVE']);
const searchAllUsers = search(['ACTIVE', 'INACTIVE']);
const searchActiveSoUsers = searchActiveUsers('stackoverflow');
const searchAllGmailUsers = searchAllUsers('gmail');
console.log(searchActiveSoUsers(userList)); // john
console.log(searchAllGmailUsers(userList)); // david & peter
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.25.0/ramda.min.js"></script>
快速解释:
咖喱
获取一个函数并返回一个函数,该函数一直返回一个函数,直到提供所有参数为止。示例:
const sum = curry((a, b, c) => a + b + c);
sum(10)(20)(30); //=> 60
sum(10, 20)(30); //=> 60
sum(10, 20, 30); //=> 60
这允许您创建与特定参数绑定的函数:
const searchActiveUsers = search(['ACTIVE']);
const searchActiveSoUsers = searchActiveUsers('stackoverflow');
searchActiveSoUsers(userList); // john
包含
获取一个值和一个列表,如果在列表中找到值,则返回 true:(在 Ramda 中,字符串和数组都是列表。)
contains('stackoverflow.com', 'john@stackoverflow.com'); //=> true
contains('ACTIVE', ['ACTIVE', 'INACTIVE']); //=> true
__
这是柯里化函数的“占位符”参数。它允许我们稍后指定参数:
const foundInJohn = contains(__, 'john@stackoverflow.com');
foundInJohn('stackoverflow'); //=> true
foundInJohn('gmail'); //=> false
在哪里
获取一个函数对象和另一个对象,如果第二个对象属性在应用于第一个对象中对应的函数时返回 true,则返回 true:
const soUser = where({email: contains('stackoverflow')});
soUser({email: 'john@stackoverflow.com'}); //=> true
soUser({email: 'david@gmail.com'}); //=> false
过滤器
这有点类似于 Array 原型上的原生过滤器方法。
const filterGmail = filter(contains('gmail'));
filterGmail(['david@gmail.com', 'john@stackoverflow.com']); //=> ['david@gmail.com']