代码之家  ›  专栏  ›  技术社区  ›  Mateja Petrovic

带Math.max的Javascript Array.reduce

  •  3
  • Mateja Petrovic  · 技术社区  · 6 年前

    const numbers = [ 1, 2, 3 ]
    
    console.log('passing arrow funciton', numbers.reduce((l, r) => Math.max(l, r)) ) // 3
    
    console.log('passing bound function', numbers.reduce(Math.max.bind(Math)) ) // NaN

    为了给你一些上下文,reduce函数需要一个回调参数。此外,回调需要两个参数,即Accumulation和Current元素(您也可以将它们分别称为left和right等)。有更多的参数,但它们是可选的。

    我试着模仿reduce函数,这个例子很有魅力

    const numbers = [1, 2, 3]
    
    const reduce = (array, func) => {
    
      let largest = 0
    
      array.forEach
      (
        (number, i, a) =>
          a[i + 1]
          ? largest = func(number, a[i + 1])
          : console.log('done')
      )
    
      return largest
    
    }
    
    console.log( 'mock reduce', reduce(numbers, Math.max.bind(Math)) ) // 3

    enter image description here

    1 回复  |  直到 6 年前
        1
  •  6
  •   Pointy    6 年前

    回拨到 .reduce() 4个 参数:累加器、当前元素、索引和整个数组。这个 NaN 是因为试图将数组本身转换为数字。

    因此,在第一次调用回调时, .max() 将会通过 1, 2, 1, [1, 2, 3] . 会回来的 ,然后 一路走来。除了

    注意,我在这里描述的是 传递给提供的回调函数,而不是传递给 .减少() .减少() 功能 总是 将所有四个参数传递给回调,但JavaScript的本质是函数可以忽略多余的参数。这正是你的第一个例子所做的。