关于JavaScript.reduce方法的一个问题&x27;s蓄能器
我正在解决这个问题,使用reduce方法创建一个函数,它将获得数组中的最大值 讲师的回答是:关于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
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())
//未定义
欢迎使用SOMath.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)
}