Карри мои функции без Лодаш - PullRequest
0 голосов
/ 31 мая 2018

Я немного потрудился над функциональным программированием и пытаюсь разобраться с частичным применением и карри.

Я ищу некоторое представление о том, как я могу применить частичное применение и карри для следующих функций:

var Page_Validators = [{
  "controltovalidate": "Content_C002_txtAddress",
  "focusOnError": "t",
  "errormessage": "No Address Entered",
  "display": "Dynamic",
  "validationGroup": "ProfileControl",
  "initialvalue": "",
  "isvalid": true
}, {
  "controltovalidate": "Content_C002_txtCity",
  "focusOnError": "t",
  "errormessage": "No City Entered",
  "display": "Dynamic",
  "validationGroup": "ProfileControl",
  "initialvalue": "",
  "isvalid": true
}, {
  "controltovalidate": "Content_C002_drpState",
  "focusOnError": "t",
  "errormessage": "State Required",
  "display": "Dynamic",
  "validationGroup": "ProfileControl",
  "initialvalue": "",
  "isvalid": true
}, {
  "controltovalidate": "Content_C002_txtZipcode",
  "focusOnError": "t",
  "errormessage": "No Zipcode Entered",
  "display": "Dynamic",
  "validationGroup": "ProfileControl",
  "initialvalue": "",
  "isvalid": true
}, {
  "controltovalidate": "Content_C002_phoneNumberFull",
  "focusOnError": "t",
  "errormessage": "Missing Phone Number",
  "display": "Dynamic",
  "validationGroup": "ProfileControl",
  "initialvalue": "",
  "isvalid": true
}, {
  "controltovalidate": "Content_C002_txtSupFullName",
  "focusOnError": "t",
  "errormessage": "No Name Entered",
  "display": "Dynamic",
  "validationGroup": "SupervisorControl",
  "initialvalue": "",
  "isvalid": true
}, {
  "controltovalidate": "Content_C002_txtSupTitle",
  "focusOnError": "t",
  "errormessage": "No Title Entered",
  "display": "Dynamic",
  "validationGroup": "SupervisorControl",
  "initialvalue": "",
  "isvalid": true
}, {
  "controltovalidate": "Content_C002_txtSupPhoneFull",
  "focusOnError": "t",
  "errormessage": "Missing Phone Number",
  "display": "Dynamic",
  "validationGroup": "SupervisorControl",
  "initialvalue": "",
  "isvalid": true
}, {
  "controltovalidate": "Content_C002_txtSupEmail",
  "focusOnError": "t",
  "errormessage": "No Email Entered",
  "display": "Dynamic",
  "validationGroup": "SupervisorControl",
  "initialvalue": "",
  "isvalid": true
}, {
  "controltovalidate": "Content_C002_SignatureField",
  "focusOnError": "t",
  "errormessage": "Signature Required",
  "display": "Dynamic",
  "validationGroup": "ProfileControl",
  "initialvalue": "",
  "isvalid": true
}];


function filterArrayBy(arr, searchString) {
  return arr.filter(key => key.controltovalidate.toLowerCase().includes(searchString.toLowerCase()));
}

function toggleValidatorsState(arr, condtion) {
  return arr.map(el => ValidatorEnable(el, condition));
}

const supervisorValidators = filterArrayBy(Page_Validators, "txtSup");
const disabledValidators = toggleValidatorsState(supervisorValidators, true);

console.log(disabledValidators);

ASIDE

Функция toggleValidatorState вызывает функцию ASP.NET, поэтому фрагмент кода не будет работать (если у вас нет asp.net)

За исключением функции ASP.NET, можно ли упростить эти функции или использовать частичное применение с карри? ??

Мне кажется, что я повторяю себя, передаваяразбить на две функции.

Я изучал использование Lodash или Ramda, но мог бы я добиться того же без использования внешней библиотеки.

1 Ответ

0 голосов
/ 31 мая 2018

Это может быть излишним, потому что код уже выглядит простым.

Но вы могли бы карри filterArayBy, связав его с Page_Validators.Таким образом, вы сможете фильтровать его по разным строкам searchStrings без необходимости каждый раз передавать массив.

Кроме того, вы можете создать новую функцию с именем disableValidators, частично применив toggleValidatorsState с condition = true.

Самый простой способ добиться этого - использовать .bind и простую лямбду, подобную этой:

function filterArrayBy(arr, searchString) {
    return arr.filter(key => key.controltovalidate.toLowerCase().includes(searchString.toLowerCase()));
}

// We are going to partially apply filterArrayBy function as the first argument is going to be the same.
// (in this context partial application does the same as currying)
const filterPageValidators = filterArrayBy.bind(null, Page_Validators);

function toggleValidatorsState(arr, condtion) {
    return arr.map(el => ValidatorEnable(el, condition));
}

// Also partially applying toggleValidatorsState to make the code more readable
const disableValidators = arr => toggleValidatorsState(arr, true);

// The usage would look like this
const disabledValidators = disableValidators(filterPageValidators('txtSup'));

Если вы хотите сделать его более сложным, вы можете проверить в этой статье реализовать свой собственный метод curry и использовать его для создания filterPageValidators.

Тогда вам нужно что-то похожее на partialRight Рамды.Таким образом, вы можете использовать этот ответ в качестве ссылки.

Наконец, ваши функции будут выглядеть примерно так:

const filterPageValidators = curry(filterArrayBy)(Page_Validators);
const disableValidators = bind_trailing_args(toggleValidatorsState, true);

Но, по моему скромному мнению, это слишком много для данного конкретного случая.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...