使用Math.max的Javascript Array.reduce

时间:2018-08-22 11:57:26

标签: javascript arrays max reduce

为什么第二个示例返回NaN,而第一个示例有效?

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函数需要一个Callback参数。此外,回调需要两个参数,即Accumulation和Current元素(您也可以左右调用它们,等等)。有更多参数,但它们是可选的。

我试图模拟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 个答案:

答案 0 :(得分:6)

.reduce()的回调传递了 4 个参数:累加器,当前元素,索引和整个数组。 NaN来自试图将数组本身转换为数字的尝试。

因此,在第一次调用回调时,将.max()传递给1, 2, 1, [1, 2, 3]。这将返回NaN,然后将一直返回NaN。除了数组中NaN的问题之外,如果您的数组很长,并且包含许多小数或负数,那么索引值也可能会降低结果的准确性。

请注意,我在这里描述的是.reduce()传递给提供的回调函数的参数列表,而不是.reduce()本身的参数。 .reduce()函数总是将所有四个参数传递给回调,但是JavaScript的本质是函数可以忽略多余的参数。这正是您第一个示例所做的。