Есть ли способ параметризации правой части оценки фильтра в функции карри - PullRequest
1 голос
/ 14 апреля 2020

Я хотел бы преобразовать следующее, чтобы сделать его многоразовым / generi c. В частности, я не уверен, какой подход выбрать для параметризации правой части оценки фильтра.

Вот то, что я имею до сих пор, и это работает для случая использования ниже. Я пытаюсь преобразовать часть карри в нечто вроде этого ...

const filterProcess = theFilter => theData => theFilter === ${dataBranch}.${dataLeaf}

Мой текущий рабочий вариант использования.

const hotelList = [
    {city: "London", hotel: 1},
    {city: "Prague", hotel: 1},
    {city: "London", hotel: 2},
    {city: "Prague", hotel: 2},
]

const isLocated = location => hotels => location === hotels.city

const hotelsIn = hotelList.filter(isLocated(location));

console.log(hotelsIn('London'))

1 Ответ

2 голосов
/ 14 апреля 2020

Используя итеративный подход, поскольку hotelsIn должна быть функцией, вы хотите, чтобы isLocated возвращала функцию, которая принимает местоположение:

const hotelList = [
    {city: "London", hotel: 1},
    {city: "Prague", hotel: 1},
    {city: "London", hotel: 2},
    {city: "Prague", hotel: 2},
]

const isLocated = location => hotel => location === hotel.city

const hotelsIn = location => hotelList.filter(isLocated(location));
// −−−−−−−−−−−−−−^^^^^^^^^^^^

console.log(hotelsIn('London'))

Затем мы можем обобщить это, выделив имя свойства (city):

const hotelList = [
    {city: "London", hotel: 1},
    {city: "Prague", hotel: 1},
    {city: "London", hotel: 2},
    {city: "Prague", hotel: 2},
]

const isLocated = (name, value) => item => value === item[name]
// −−−−−−−−−−−−−−−^^^^^       ^    ^^^^    ^^^^^     ^^^^^^^^^^

const hotelsIn = (name, location) => hotelList.filter(isLocated(name, location))
// −−−−−−−−−−−−−−^^^^^^^^^^^^^^^^^^^

console.log(hotelsIn('city', 'London'))
// −−−−−−−−−−−−−−−−−−^^^^^^^

Если хотите, вы можете добавить функцию hotelsInCity:

const hotelList = [
    {city: "London", hotel: 1},
    {city: "Prague", hotel: 1},
    {city: "London", hotel: 2},
    {city: "Prague", hotel: 2},
]

const isLocated = (name, value) => item => value === item[name]

const hotelsIn = (name, location) => hotelList.filter(isLocated(name, location))

const hotelsInCity = city => hotelsIn('city', city)

console.log(hotelsInCity('London'))
...