【问题标题】:Weird function about Array.reduce() [duplicate]关于 Array.reduce() 的奇怪函数 [重复]
【发布时间】:2021-04-11 21:26:26
【问题描述】:

我的代码如下:

const reducedValue = array.reduce((acc, curr) => {
    if (decision(curr)){
        return acc++;
    }
    return acc;
}, 0);

console.log(samApples) 始终为0 时,即使decision 多次为true。但是,当我更改为 acc += 1 时,一切正常。

为什么会发生这种情况?

【问题讨论】:

    标签: javascript arrays reduce


    【解决方案1】:

    ++ 运算符如果在变量(Y++ - 后缀)返回值之后使用,然后将其递增。如果在值之前使用(++Y - 前缀),则递增,然后返回:

    let x = 1, y = 1;
    
    console.log(x++); // returns x then increments
    
    console.log(++y); // increments y and then returns it

    但是,您不需要递增累加器,而是返回新值:

    const reducedValue = array.reduce((acc, curr) => 
      acc + (decision(curr) ? 1 : 0)
    , 0);
    

    由于您可以使用一元 + 运算符将布尔值转换为数字,因此您可以将其缩短为:

    const reducedValue = array.reduce((acc, curr) => 
      acc + decision(curr) // acc + +decision(curr) in typescript
    , 0);
    

    【讨论】:

    • acc + decision(curr) 就够了。
    • 是的。我习惯于打字(显式转换)。
    【解决方案2】:

    这是因为++ 运算符的工作方式。当您执行 x++ x 在当前操作之后递增时,在您的情况下是 return 并且由于原始类型作为值而不是作为函数参数的引用传递,因此在 return 之后处理增量并且不会延续到下一次迭代。

    相反+= 被立即执行,因此在任何其他操作之前。因此,为什么这有效。但是,如果您更喜欢使用++ 语法,请像这样使用它:++x,因为此操作是在return 之前执行的(并且与+= 1 完全一样)。


    还可以查看 MDN 上的这个(可以说更好的)描述: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Increment#description


    还有一点概念证明:

    const val = [1,2,3,4,5,6].reduce((acc, curr) => {
       return ++acc;
    }, 0);
    
    console.log(val)

    【讨论】:

      猜你喜欢
      • 2019-04-03
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-22
      • 2016-01-26
      • 2016-02-22
      相关资源
      最近更新 更多