Я создаю приложение React с помощью Ramda. Я все еще новичок в функциональном программировании (~ два месяца назад).
У меня есть такой список контактов:
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, я написал следующие функции, которые принимают 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));
Как видите, этот код запутан (даже если подумать, что он намного красивее, чем делать это по необходимости). Я карри value =>
много раз, что кажется неоптимальным. Я также сомневаюсь, что этот код выполняет итерацию по контактам только один раз и эффективен ли он.
Как бы вы отфильтровали и сопоставили (выберите только соответствующие ключи + lowerCase
) большой список контактов, не повторяя его дважды или более? Есть ли способ избежать каррирования и написать этот очиститель?