javascript – Ramda:如何通过currying,过滤和映射来最小化计算资源?
作者:互联网
我正在使用Ramda构建一个React应用程序.我还是功能编程的新手(约两个月).
我有一个这样的联系人列表:
const contacts = [
{
id: 1,
firstName: 'Sven',
lastName: 'Hillstedt',
city: 'Aachen',
company: '',
position: 'Student',
group: 'friends',
tendency: 'maintain'
},
{
id: 2,
firstName: 'David',
// ...
];
给定一个字符串我需要过滤这个(很长,10.000-100.000)列表.但我只需要考虑键firstName,lastName,city,company和position.有一个数组包含这些:
const FIRST_NAME = 'firstName';
const LAST_NAME = 'lastName';
const CITY = 'city';
const COMPANY = 'company';
const POSITION = 'position';
export const stringFields = [FIRST_NAME, LAST_NAME, CITY, COMPANY, POSITION];
现在,使用Ramda我编写了以下函数,它接受一个字符串和一个联系人列表,映射在contacts`键上,选择相关的并缩小它们,然后返回已过滤的联系人:
import { any, filter, includes, map, pick, pipe, toLower, values } from 'ramda';
const contactIncludesValue = value =>
pipe(
pick(stringFields),
map(toLower),
values,
any(includes(value))
);
const filterContactsByValue = value => filter(contactIncludesValue(value));
正如你所看到的,这段代码很混乱(甚至认为它比命令式更漂亮).我curry value =>很多次,感觉不太理想.我也在质疑,这段代码是否只对联系人进行一次迭代,是否有效.
你将如何过滤和映射(仅选择相关键lowerCase)一个大的联系人列表,而不是迭代两次或更多次?有没有办法避免我的currying并写下这个清洁工?
解决方法:
这里有几件事要回应.
>即使评论有点讽刺,@zerkms也是对的.尝试性能优化没有多大意义,除非您知道代码实际上具有较差的性能,特别是如果它使代码更难编写或维护.
>你没有咖喱价值=>多次.它只是预先计算,每次过滤列表时,您的值的部分应用会发生一次.
>您只能一次迭代您的联系人.但在每个人的内部都是对你的任何一个领域的调用.如果找到匹配,这个会提前返回,所以计算调用次数并不容易,但可能是O(m * n),其中m是字段数,n是联系人数.
此版本的代码稍微简洁一些.您可能会或可能不会发现它更具可读性:
const contactIncludesValue = value =>
pipe(
props(stringFields),
map(toLower),
any(includes(value))
);
const filterContactsByValue = pipe(contactIncludesValue, filter);
请注意道具比pick(…)更方便 – >值和中间映射(toLower)之后也能正常工作.
标签:ramda-js,javascript,arrays,functional-programming,currying 来源: https://codeday.me/bug/20190731/1585750.html