Автор оригинала: Yazeed Bzadough.
30 секунд кода является блестящей коллекцией фрагментов JavaScript, усваиваемые в ≤ 30 секунд. Любой, кто ищет мастер JavaScript, должен пройти все это.
Вдохновлен Рамда Я внес собой когда ()
до 30secondsofcode Официальный Github Repo Отказ Это одна мои любимые функции.
когда ()
занимает 3 параметра:
Pref
: Функция предиката (должна вернутьTrue
илиfalse
)Wepentrue
: Функция для запуска, еслиPref
Возвращаетправда
Отказ- Значение:
х
Отказ
Вот самая базовая реализация:
when = (pred, whenTrue, x) => { if (pred(x)) { return whenTrue(x); } else { return x; } };
Что вы можете сократить:
when = (pred, whenTrue, x) => (pred(x) ? whenTrue(x) : x);
Допустим, мы хотим тройной четные номера
when((x) => x % 2 === 0, (x) => x * 3, 2); // 6
Мы получили 6
потому что 2
это четное число. Что делать, если мы пройдем 11
?
when((x) => x % 2 === 0, (x) => x * 3, 11); // 11
Еще раз
Когда
В настоящее время нужны все 3 параметра одновременно – что, если мы могли бы поставить только первые 2, и дать х
позже?
when = (pred, whenTrue) => (x) => (pred(x) ? whenTrue(x) : x);
Эта версия, что я отправил 30secondsofcode.org Отказ Теперь наш код более гибкий.
tripleEvenNums = when((x) => x % 2 === 0, (x) => x * 3); tripleEvenNums(20); // 60 tripleEvenNums(21); // 21 tripleEvenNums(22); // 66
Далее дальше
Мы можем пройти х
позже, потому что когда (ПРЕД, Weptrue)
Возвращает функцию, ожидая х
Отказ Что делать, если мы карри когда ()
?
Если вы новичок в Carrying см. Моя статья в теме.
Карновая функция не нуждается в своих параметрах одновременно. Вы можете поставить некоторое и получить функцию, которая доставит остальные, что позволяет для мощных шаблонов.
Глупый пример
Представьте, что у нас есть два списка людей, оба содержат парень по имени Бобо
Отказ
Бобо
Хочет прозвище для каждого списка.
- Если мы найдем
Бобо
в списке 1, измените его имя вB деньги
Отказ - Если мы найдем
Бобо
В списке 2 измените его имя вБо-Боб
Отказ
Carrying Когда
Позволяет нам легко написать функцию для каждой заботы.
Если вы следуете вдоль, вот Карри
Функция от 30secondsofcode.org Отказ
curry = (fn, arity = fn.length, ...args) => arity <= args.length ? fn(...args) : curry.bind(null, fn, arity, ...args);
Нам понадобится предикат, чтобы найти Бобо
Отказ
isBobo = (person) => person.name === 'Bobo';
Чтобы сохранить наши функции чистыми, нам понадобится способ Искуснимо изменить имя человека.
changeName = (newName, obj) => ({ ...obj, name: newName });
Давайте также будем начать это, чтобы мы могли поставить только newname
Отказ
changeName = curry((newName, obj) => ({ ...obj, name: newName }));
Вот наши списки.
list1 = [ { name: 'Bobo', id: 1, iq: 9001 }, { name: 'Jaime', id: 2, iq: 9000 }, { name: 'Derek', id: 3, iq: 8999 } ]; list2 = [ { name: 'Sam', id: 1, iq: 600 }, { name: 'Bobo', id: 2, iq: 9001 }, { name: 'Peter', id: 3, iq: 8 } ];
Давайте набрать на карту list1
Отказ
doIfBobo = when(isBobo); renameToBMoney = changeName('B Money'); list1.map(doIfBobo(renameToBMoney));
Наш результат:
[ { name: 'B Money', id: 1, iq: 9001 }, { name: 'Jaime', id: 2, iq: 9000 }, { name: 'Derek', id: 3, iq: 8999 } ];
Из-за Когда
мы изменили только Бобо
и проигнорировал всех остальных!
Теперь карта на list2
Отказ
renameToBoBob = changeName('Bo-bob'); list2.map(doIfBobo(renameToBoBob));
Our result: [{ "name": "Sam", "id": 1, "iq": 600 }, { "name": "Bo-bob", "id": 2, "iq": 9001** }, { "name": "Peter", "id": 3, "iq": 8 } ];
Выглядит хорошо для меня! Мы дали Бобо
его прозвища, не затрагивающие кого-либо еще.
Если вы заинтересованы, рассмотрите эти ссылки: