Javascript重构,可以使用map和filter

Javascript重构,可以使用map和filter,javascript,ecmascript-6,functional-programming,Javascript,Ecmascript 6,Functional Programming,这是函数中的返回,我想在数组中应用40%的折扣,以防产品颜色为红色。这是回报,它起作用了。 我想知道一种重构它的方法,我也想知道在这种情况下是否可以使用链式过滤器功能,如果可能的话,应该如何做? 如果你能用更好的纯函数,我会很感激,我正在学习函数编程 return cart.map( (x) => { if (x.color === "red") { x.price = x.price * 0.4; } return x; }); 谢谢您可以使用三元运算符隐式返回

这是函数中的返回,我想在数组中应用40%的折扣,以防产品颜色为红色。这是回报,它起作用了。 我想知道一种重构它的方法,我也想知道在这种情况下是否可以使用链式过滤器功能,如果可能的话,应该如何做? 如果你能用更好的纯函数,我会很感激,我正在学习函数编程

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

谢谢

您可以使用三元运算符隐式返回。您不能使用过滤器,因为它会更改长度,而您的代码不需要更改长度

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

可以使用三元运算符隐式返回。您不能使用过滤器,因为它会更改长度,而您的代码不需要更改长度

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

当前代码通常是可以的,如果您想减少if语句的数量并重用isRed筛选和折扣功能,则可以将其更改为类似于:

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))

当前代码通常是可以的,如果您想减少if语句的数量并重用isRed筛选和折扣功能,则可以将其更改为类似于:

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))

如果您不介意使用外部库,您可以使用lodash方法过滤什么?@Zoti nolibrary@Andy不过滤数组,只将其应用于红色如果您不介意使用外部库,可以使用lodash方法过滤什么?@Zoti nolibrary@Andy不过滤数组,但将其仅应用于红色时请注意,当颜色为红色时,此解决方案将替换结果数组中的对象。因此,输入数组中的元素不再严格等于输出数组中相同索引处的元素。@Codekie此Q被标记为FP,因此对象的引用标识无关紧要。@Codekie如果回调应该是纯函数,那么返回值应该是一个新对象-否。它只需要在其类型更改时是一个新对象。同样,在FP中,您不应该依赖于引用标识,而应该依赖于值。@bob我明白您的意思。但仅仅因为这段代码将是FP,并不意味着它周围的代码将是FP。根据这段代码判断,不使用不可变值,因此引用标识很可能很重要。在这种情况下,最好保持一致。要么修改在位对象,要么返回新副本。这就是我最初的意图。指出这是不一致的。@Codekie我也明白你的意思。此外,我之前的评论并不精确:只要值发生更改,就必须创建一个新对象,而不是基础类型。请注意,当颜色为红色时,此解决方案将替换结果数组中的对象。因此,输入数组中的元素不再严格等于输出数组中相同索引处的元素。@Codekie此Q被标记为FP,因此对象的引用标识无关紧要。@Codekie如果回调应该是纯函数,那么返回值应该是一个新对象-否。它只需要在其类型更改时是一个新对象。同样,在FP中,您不应该依赖于引用标识,而应该依赖于值。@bob我明白您的意思。但仅仅因为这段代码将是FP,并不意味着它周围的代码将是FP。根据这段代码判断,不使用不可变值,因此引用标识很可能很重要。在这种情况下,最好保持一致。要么修改在位对象,要么返回新副本。这就是我最初的意图。指出这是不一致的。@Codekie我也明白你的意思。除此之外,我之前的评论是不精确的:只要值发生更改,就必须创建一个新的对象,而不是底层类型。为什么不使用x=>{return{…},而使用x=>{…}?谢谢你的回答@udalmik它还帮助我更好地理解纯函数。我投了Maheer的票,因为这是我想要的答案,即使我不能用正确的方式代替x=>{return{…},为什么不选x=>{…}?谢谢你的回答@udalmik它也帮助我更好地理解纯函数。我投了马希尔的票,因为这正是我想要的,即使我不能用正确的方式问