Рубрики
Без рубрики

Как условно изменять значения с помощью () в JavaScript

30 секунд кода является блестящей коллекцией фрагментов JavaScript, усваиваемые в ≤ 30 секунд. Любой, кто ищет мастер JavaScript, должен пройти все это. Вдохновленный Ramda, я внес свой вклад, когда () до 30secondsofcode’s официальный репо Github repo. Это одна мои любимые функции. Когда () занимает 3 параметра: Предписание: A

Автор оригинала: Yazeed Bzadough.

30 секунд кода является блестящей коллекцией фрагментов JavaScript, усваиваемые в ≤ 30 секунд. Любой, кто ищет мастер JavaScript, должен пройти все это.

Вдохновлен Рамда Я внес собой когда () до 30secondsofcode Официальный Github Repo Отказ Это одна мои любимые функции.

когда () занимает 3 параметра:

  1. Pref : Функция предиката (должна вернуть True или false )
  2. Wepentrue : Функция для запуска, если Pref Возвращает правда Отказ
  3. Значение: х Отказ

Вот самая базовая реализация:

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
 }
];

Выглядит хорошо для меня! Мы дали Бобо его прозвища, не затрагивающие кого-либо еще.

Если вы заинтересованы, рассмотрите эти ссылки: