gpt4 book ai didi

javascript - Ramda : How to minimize computing resources by currying, 过滤和映射?

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:39:08 24 4
gpt4 key购买 nike

我正在使用 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)列表。但我只需要考虑键 firstNamelastNamecitycompanyposition 。有一个包含这些的数组:

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 编写了以下函数,它接受一个 string 和一个联系人列表,映射到联系人的键上,选择相关的键并将它们小写,然后返回过滤后的联系人:

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 也是对的。尝试性能优化毫无意义,除非您知道代码实际上性能不佳,尤其是当它使代码更难编写或维护时。

  • 您不要多次柯里化(Currying) value =>。它仅在前面进行柯里化(Currying),每次过滤列表时都会部分应用您的值。

  • 您只迭代联系人一次。但在每个字段中,都有对字段列表的 any 的调用。如果找到匹配项,它会提前返回,因此计算调用次数并非易事,但它可能是 O(m * n),其中 m 是字段数和 n 联系人数。

这个版本的代码稍微更简洁一些。您可能会或可能不会发现它更具可读性:

const contactIncludesValue = value =>
pipe(
props(stringFields),
map(toLower),
any(includes(value))
);

const filterContactsByValue = pipe(contactIncludesValue, filter);

请注意,propspick(...) -> values 更方便,而中间的 map(toLower) 只是工作以及之后。

关于javascript - Ramda : How to minimize computing resources by currying, 过滤和映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55111791/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com