关于JavaScript.reduce方法的一个问题&x27;s蓄能器

关于JavaScript.reduce方法的一个问题&x27;s蓄能器,javascript,arrays,reduce,accumulator,Javascript,Arrays,Reduce,Accumulator,我正在解决这个问题,使用reduce方法创建一个函数,它将获得数组中的最大值 讲师的回答是: const numbers = [1, 2, 3, 4, 4, 5, 1, 3, 4]; const max = getMax(numbers); console.log(max); function getMax(array) { if (array.length === 0) return undefined; return array.reduce((accumulator, curr

我正在解决这个问题,使用reduce方法创建一个函数,它将获得数组中的最大值

讲师的回答是:

const numbers = [1, 2, 3, 4, 4, 5, 1, 3, 4];
const max = getMax(numbers);
console.log(max);
function getMax(array) {
   if (array.length === 0) return undefined;
   return array.reduce((accumulator, current) => {
       return (accumulator > current) ? accumulator : current
}); 
我试过这样的方法:

 return array.reduce((accumulator, current) => {
    if (accumulator < current)
        console.log(accumulator, current);
        return accumulator = current;
});   
返回数组。减少((累加器,电流)=>{
if(蓄能器<电流)
控制台日志(累加器,当前);
返回累加器=电流;
});   
我添加了console.log(acculator,current),因为我想看看我的代码发生了什么。日志显示如下:

12

23

34

45

13

34

4

问题1。我想知道为什么我的函数没有给出正确的输出(它返回4,而不是正确的输出5)。在循环过程中,当“累加器”被分配为5时,它不应该保持为5吗


问题2。如果if语句下面已经有返回,为什么我需要在函数中返回(或在前面添加返回)数组?

尝试使用Math.max方法:

const numbers = [1, 2, 3, 4, 4, 5, 1, 3, 4]
numbers.reduce((acc, rec) => Math.max(acc, rec))

//5


如果需要查找不带Math.max.的max值,则在
if
语句之后没有使用
{…}
,因此满足条件时只会出现第一行
console.log(…)
。每次迭代都会出现
accumlator=current
行。当使用命令式
if
语句时,必须使用
return
。但是,在使用函数式表达式时,可以跳过
返回
,即
(累加器,当前)=>累加器
,表示“如果累加器小于电流,则返回电流,否则返回累加器”

考虑这个分解的程序。当我们将
max
视为一个独立函数时,它可以帮助我们准确地看到
reduce
所期望的函数类型-

const max=(a=0,b=0)=>
a
numbers.length==0//如果numbers.length为零
? 未定义//返回未定义
:number.reduce(max)//否则返回reduce
log(getMax([1,2,3,4,4,5,1,3,4]))
// 5
console.log(getMax([]))
//未定义
console.log(getMax())

//未定义
欢迎使用SO
Math.max(…nums)
肯定更简单。您的reduce版本没有多大意义——return语句中的赋值实际上没有实现任何功能,累加器和当前值从未更改过——
console.log
是有条件地记录的。在函数结束之前避免使用
console.log
,这可能会导致混淆。您没有在
if
语句之后使用
{…}
,因此当满足条件时,只有第一行
console.log(…)
。每次迭代都会出现
accumlator=current
行。当使用命令式
if
语句时,必须使用
return
。但是,在使用函数式表达式时,可以跳过
返回
,即
(累加器,当前)=>累加器
,表示“如果累加器小于电流,则返回电流,否则返回累加器”。当
(累加器>=电流)
时,返回值是多少?没有,所以蓄能器是空的empty@ggorlen提到“讲师”,我认为练习的重点是编写自己的代码来学习
reduce
或lambdas或类似的东西,而
Math.max()
是不允许的。谢谢大家-你能回答我的问题2吗,你可能已经有了,但我仍然不确定我是否理解@谢谢你简单地做
Math.max(…numbers)
Math.max处理数字,但输入是数字数组,所以我决定将这个方法与reduce结合起来。是的,你选择了把事情复杂化,或者简单地
const getMax=(arr=[])=>arr.reduce((a,c)=>(a>c,未定义)
不,它不是那么简单,莫霍先生
a=undefined
在减速机的第一次迭代中,因此您正在执行
undefined>…
这是一个无效的比较。您是否同意
const max1=(a,b)=>a>b?a:b
constmax2=(a,b)=>a
?现在您可以解释为什么
numbers.reduce(max1,未定义)
返回
5
numbers.reduce(max2,未定义)
返回
未定义
max1
max2
对于所有
x
y
都是相同的
max1
并非“完美”工作,而是运气不佳。恰好在JavaScript中,
undefined
为所有
x
返回
false
,因此
max1
偶然发现了正确答案。不,这不一样。如果
a===未定义
a>b?a:b
返回
b
a
返回
a
;与undefined的任何比较都返回false,这正是为什么我选择了
a>b
,而不是
a
。这不是一个愚蠢的运气。当你给两个相等的函数一个未定义的输入时,你会得到一个未定义的输出。。。将
未定义的
传递到

function max(numbers) {
  return list.reduce((acc, rec) => acc > rec ? acc : rec)
}