编程语言
首页 > 编程语言> > javascript – Ramda:如何通过currying,过滤和映射来最小化计算资源?

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