Как отфильтровать коллекцию с помощью каррирования в 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')
);

Удачного кодирования!