Как отфильтровать коллекцию с помощью каррирования в javascript?
В предыдущем посте я обсуждал основной принцип каррирования в javascript, показывая, как можно частично использовать комбинацию функций.
Сегодня я предлагаю вам создать функцию для фильтрации коллекции, основанную на этом принципе.
Для выполнения кода нам понадобится файл javascript и среда node.js.
Прежде всего, мы создадим документ javascript и создадим коллекцию объектов, то есть массив объектов, которые мы поместим в константу:
const collection = [
{
name: 'test 1',
rarity: 'rare',
color: 'red',
},
{
name: 'test 2',
rarity: 'rare',
color: 'black',
},
{
name: 'test 3',
rarity: 'common',
color: 'green',
},
];
Да, как старый игрок MTG не удержался :)
Затем мы создадим функцию, которая будет брать коллекцию, фильтровать ее на основе критерия и давать значение для этого критерия.
Функция должна иметь вид:
карточка коллекции = ›критерий === стоимость
Для этого мы используем функцию .filter()
и напишем следующую функцию:
const myFilter = (coll) => (key) => (val) =>
coll.filter((card) => carte[key] === val);
Находим указанный принцип действия.
использование
Использование полной функции
Мы можем использовать функцию, каждый раз задавая все параметры.
Например:
console.log('myFilter: ', myFilter(collection)('rarity')('rare'));
// displays :
// myFilter: [
// { name: 'test 1', rarity: 'rare', color: 'red' },
// { name: 'test 2', rarity: 'rare', color: 'black' }
// ]
Или даже :
console.log('myFilter: ', myFilter(collection)('color')('red'));
// displays
// myFilter: [ { name: 'test 1', rarity: 'rare', color: 'red' } ]
Но мы также можем создавать предопределенные фильтры.
Использование при составлении новых функций
Если я хочу создать фильтр по цвету, я определяю этот фильтр, составляя частичную композицию:
const myColorFilter = myFilter(collection)('color');
Все, что мне нужно сделать, это использовать его и указать значение желаемого цвета.
console.log('myColorFilter: ', myColorFilter('green'));
// displays
// myColorFilter: [ { name: 'test 3', rarity: 'common', color: 'green' } ]
И фильтр редкости по тому же принципу:
const myRarityFilter = myFilter(collection)('rarity');
console.log('myRarityFilter: ', myRarityFilter('rare'));
// displays
// myRarityFilter: [
// { name: 'test 1', rarity: 'rare', color: 'red' },
// { name: 'test 2', rarity: 'rare', color: 'black' }
// ]
Пойти немного дальше
Если теперь мы хотим выполнить фильтрацию по редкости и цвету, мы должны передать результат фильтра редкости в качестве параметра функции и выполнить фильтрацию по цвету:
const myColorFilter = myFilter(collection)('color');
const myRarityFilter = myFilter(collection)('rarity');
console.log(
'myRarityAndColorFilter: ',
myFilter(myRarityFilter('rare'))('color')('black')
);
// displays
// myRarityAndColorFilter: [ { name: 'test 2', rarity: 'rare', color: 'black' } ]
Вывод
Каррирование предлагает мощные возможности при частичном использовании функций.
Я использую эти принципы как можно скорее, чтобы упростить написание кода и максимально расставить приоритеты для факторизации и повторного использования.
Полный код, использованный в нашем примере:
const collection = [
{
name: 'test 1',
rarity: 'rare',
color: 'red',
},
{
name: 'test 2',
rarity: 'rare',
color: 'black',
},
{
name: 'test 3',
rarity: 'common',
color: 'green',
},
];
const myFilter = (coll) => (key) => (val) =>
coll.filter((card) => carte[key] === val);
const myColorFilter = myFilter(collection)('color');
const myRarityFilter = myFilter(collection)('rarity');
console.log('myFilter: ', myFilter(collection)('rarity')('rare'));
console.log('myFilter: ', myFilter(collection)('color')('red'));
console.log('myColorFilter: ', myColorFilter('green'));
console.log('myRarityFilter: ', myRarityFilter('rare'));
console.log(
'myRarityAndColorFilter: ',
myFilter(myFilterrarity('rare'))('color')('black')
);
Удачного кодирования!