【问题标题】:Understanding the many function parameters in .reduce()了解 .reduce() 中的许多函数参数
【发布时间】:2016-08-09 08:30:34
【问题描述】:

下面的.reduce() 方法,取自this SO answer,包含许多参数(显然称为解构对象)。

这些参数代表什么功能?

let {result} = array.reduce(({arg_1, arg_2, arg_3}, arg_4)=> {
}, {result: [], arg_2: 0, arg_3: undefined})
return result

【问题讨论】:

  • 我相信你在这里感到困惑的是argument unpacking
  • 我们无法分辨这些参数代表什么:它们只是通用变量名。你是想问像这样使用{}的语法吗?
  • @deceze 确切地说,感谢您对它的描述比我在问题中所做的更好。
  • @nnnnnn 是的,这正是我感到困惑的地方。用两个简单的参数解释.reduce() 无处不在。

标签: javascript ecmascript-6 reduce arrow-functions


【解决方案1】:

reduce 方法接受两个参数。

语法:

arr.reduce(callback[, initialValue])

因此,在您的示例中,回调用作第一个参数是arrow function。让我们打破它:

1. ({arg_1, arg_2, arg_3}, arg_4)=> {}  //the callback
2. {arg_1: [], arg_2: 0, arg_3: undefined} // the initial value

({arg_1, arg_2, arg_3}, arg_4)两个 参数用于arrow function,第一个被声明为对象。

您会注意到arg_4 的初始值丢失了。

【讨论】:

    【解决方案2】:

    如果 OP 偶然发现解构符号,对于给定的示例,第一个参数是初始值(用前两个 cmets 的 provided links 描述),用作收集器或累加器对象。它由另一个方法的前三个参数组成。结果是通过解构赋值写入的,因此,将有 3 个变量,arg_1arg_2arg_3 派生自最终返回的收集器对象的同名参数。

    编辑,因为 OP 提供的示例代码已更改...

    下一个示例考虑了 OP 的链接 SO 代码参考...

    let {slots} = array.reduce(({slots, count, prev}, item)=> {
    
        // ... do something with slots
        // ...
        // while iterating always needs to return
        // an equally structured collector object
    
        return {slots, count: count + 1, prev: item}
    
    }, {slots: [], count: 0, prev: undefined})
    
    /*
    return slots; // does not really make sense within this shortened example's context.
    */
    

    ... 等于 ...

    var slots = array.reduce(function (collector, item) {
    
        var
            slots = collector.slots,
            count = collector.count,
            prev  = collector.prev;
    
        // ... do something with slots
        // ...
        // while iterating always needs to return
        // an equally structured collector object
    
        return {slots: slots, count: count + 1, prev: item};
    
    }, {slots: [], count: 0, prev: undefined}).slots;
    

    【讨论】:

      【解决方案3】:

      Array.reduce 有 2 个参数,

      1. 回调
      2. 初始值

      Array.reduce的回调有4个参数:

      1. 上一个值
      2. 当前值
      3. 当前索引
      4. 数组

      previousValue 的值在循环开始时为 initialValue。如果未传递任何值,第一个元素将被视为previousValuecurrentValue 将具有下一个值。从他们那里,previousValue 将保存上一次迭代中返回的值。

      示例

      无初始值

      var a = [1,2,4,4,5,6,7,8];
      
      a.reduce(function(p,c,i,a){
        console.log(p,c,i,a);
        return c
      })

      有初始值

      var a = [1,2,4,4,5,6,7,8];
      
      a.reduce(function(p,c,i,a){
        console.log(p,c,i,a);
        return c
      },0)

      参考

      Array.reduce

      【讨论】:

        猜你喜欢
        • 2015-10-24
        • 1970-01-01
        • 2017-03-27
        • 2012-04-11
        • 2013-11-04
        • 1970-01-01
        • 2020-09-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多