Javascript重构,可以使用地图和过滤器

时间:2019-07-08 11:46:10

标签: javascript ecmascript-6 functional-programming

这是函数的返回值,我想在数组中应用40%的折扣,以防万一产品颜色为红色。这是回报,正在发挥作用。 我想知道一种重构它的方法,也想知道在这种情况下是否可以链接过滤器函数,如果可能的话应该怎么做? 另外,如果您可以使用更好的纯函数来实现它,我将不胜感激,我正在学习函数式编程。

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

谢谢

2 个答案:

答案 0 :(得分:5)

当前代码通常是可以的,如果您想减少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))

答案 1 :(得分:3)

您可以使用三元运算符隐式返回。您不能使用filter(),因为它会更改长度,并且您的代码不需要更改长度

return cart.map(x => x.color === "red" ? {...x, price:x.price * 0.4} : x)