Автор оригинала: 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
}
];
Выглядит хорошо для меня! Мы дали Бобо его прозвища, не затрагивающие кого-либо еще.
Если вы заинтересованы, рассмотрите эти ссылки: