Как бы вы фильтровали и отображали (выбирали только соответствующие ключи + нижний регистр) большой список контактов, не повторяя его дважды или более?Есть ли способ избежать моего карри и написать этот очиститель?
Если вам нужно отфильтровать И преобразовать ваши данные за один раз, я не понимаю, как вы могли бы сделатьпри этом используется только filter
.
Например, это не сохранит a
и не преобразует его:
const list = [
{a: 'foo'},
{b: 'bar'}
];
console.log(
filter(pipe(map(toUpper), has('a')), list)
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {filter, pipe, map, toUpper, has} = R;</script>
Для этого вам нужно либо использовать reduce
, либо преобразователь.
Вот решение с использованием преобразователя.В этом примере:
- Работать только с объектами, свойство
a
которых равно 1
. - Свойство
b
, добавить 10
- Затем выберите
b
const list = [
{a: 1, b: 2},
{a: 2, b: 20},
{a: 1, b: 3},
{a: 2, b: 30},
{a: 1, b: 4},
{a: 2, b: 40},
];
console.log(
into([],
compose(
filter(propEq('a', 1)),
map(over(lensProp('b'), add(10))),
map(pick(['b']))
),
list)
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {into, compose, filter, propEq, map, pick, over, lensProp, add} = R;</script>
Хорошая особенность использования преобразователей заключается в том, что они отделяют логику для получения результата (массив) от логики для преобразования данных.
into([])
говорит Рамде, что вы создаете массив, и поэтому все, что выходит из вашей цепочки compose
, должно быть добавлено к нему.
into('')
говорит Рамде, что вы производитестрока.Ваша цепочка compose
должна возвращать только строку.into
позаботится о его соединении до конечного результата:
const list = [
{a: 1, b: 2},
{a: 2, b: 20},
{a: 1, b: 3},
{a: 2, b: 30},
{a: 1, b: 4},
{a: 2, b: 40},
];
console.log(
into('',
compose(
filter(propEq('a', 1)),
map(over(lensProp('b'), add(10))),
map(prop('b'))
),
list)
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
<script>const {into, compose, filter, propEq, map, over, lensProp, add, prop} = R;</script>