Рефакторинг Javascript, возможно использовать карту и фильтр - PullRequest
1 голос
/ 08 июля 2019

Это возвращение в функцию, я хочу применить 40% скидку в массиве, на случай, если цвет продукта красный. Это возвращение, это работает. Я хотел бы знать способ его рефакторинга, а также я хотел бы знать, возможно ли в этом случае объединить функцию фильтра, если это возможно, как это сделать? Также, если вы можете сделать это с более чистыми функциями, я был бы признателен, я изучаю функциональное программирование.

return cart.map( (x) => {
  if (x.color === "red") {
    x.price = x.price * 0.4;
  }
   return x;
 });

Спасибо

Ответы [ 2 ]

5 голосов
/ 08 июля 2019

Текущий код в целом в порядке, если вы хотите уменьшить количество операторов if и повторно использовать isRed фильтр и discount функцию, то вы можете изменить его на что-то похожее на:

const cart = [{price: 3, color: 'red'}, {price: 3, color: 'blue'}];

const applyIf = (condition, fn) => {
    return x => condition(x) ? fn(x) : x;
}

const isRed = x => x.color === 'red';

const discount = x => ({ ...x, price: x.price * 0.4 });

cart.map(applyIf(isRed, discount))
3 голосов
/ 08 июля 2019

Вы можете неявно вернуться с помощью троичного оператора. Вы не можете использовать filter(), потому что это меняет длину, и ваш код не должен менять длину

return cart.map(x => x.color === "red" ? {...x, price:x.price * 0.4} : x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...