【发布时间】:2020-08-15 03:53:28
【问题描述】:
我正在解决这个问题,以使用 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;
});
我添加了 console.log (accumulator, current),因为我想看看我的代码发生了什么。日志显示如下:
1 22 33 44 51 33 44
问题 1。我想知道为什么我的函数没有给出正确的输出(它返回 4,而不是正确的输出 5)。 “累加器”在循环期间被分配为 5 时不应该保持 5 吗?
问题2.为什么在if语句下面已经有return的情况下,函数中还需要return(或者前面加return)?
【问题讨论】:
-
欢迎来到 SO!
Math.max(...nums)肯定更容易。您的 reduce 版本没有多大意义——return 语句中的赋值并没有真正实现任何目标,并且 accumulator 和 current 永远不会改变——console.log是有条件地记录的。在函数结束之前避免使用console.log——这可能会造成混乱。 -
您没有在
if语句之后使用{ ... },因此只有第一行console.log(...)在满足条件时发生。accumlator = current行总是在每次迭代中出现。使用命令式ifstatement 时必须使用return。但是,当使用函数式表达式时,您可以跳过return,即(accumulator, current) => accumulator < current ? current : accumulator,它表示“如果累加器小于当前值,则返回当前值,否则返回累加器”。 -
(accumulator >=current)时的返回值是什么?没有,所以累加器是空的 -
@ggorlen 提到“讲师”我认为练习的重点是编写自己的代码来学习
reduce或 lambdas 或类似的东西,而Math.max()不会允许。 -
谢谢大家 - 你能回答我的问题 #2,你可能已经回答了,但我仍然不确定我是否理解。 @谢谢你
标签: javascript arrays reduce accumulator