当我们传递一个带有一个参数的函数时,JavaScript 的 reduce 方法表现得很奇怪
Posted
技术标签:
【中文标题】当我们传递一个带有一个参数的函数时,JavaScript 的 reduce 方法表现得很奇怪【英文标题】:JavaScript reduce method behaving strangely when we pass a function with one argument 【发布时间】:2021-12-30 12:15:00 【问题描述】:javascript 菜鸟在这里。我不知道如何计算 map1,我一次更改了 array1 的每个元素,并且 map1 仍然打印为 -8。有没有人有任何关于 reduce() 方法的详细解释的链接?我一个都没找到!或者谁能解释一下发生了什么?
const array1 = [1, 4, 9, 16];
const map1 = array1.reduce(x => x - 2, 0);
console.log(map1); // shows -8
【问题讨论】:
结果完全独立于数组的值。你可以看看Array#reduce
的累加器。它的起始值为零,每次迭代都减 2。
这里没什么奇怪的,因为您只传递了累加器并减去 2 四次(数组的长度)。
【参考方案1】:
在 Javascript 中,reduce
接受
array1.reduce(() => , initialValue);
这个回调主要有两个参数
第一个参数 = 累加器 第二个参数 = 当前值累加器就像一个盒子,它可以获取上一次迭代返回的任何值。 我们可以使用它在每次迭代中添加内容。
让我们看一个基本的例子:
const initialValue = 0
const answer = [1,2,3,4].reduce((acc, curr) =>
, initialValue);
console.log('answer: ', answer);
这里我们有回调函数,它什么都不返回。
让我们看看这个例子的代码执行流程
对于第一次迭代,accumulator 设置为 0,
由于我们不返回任何内容,每次迭代都会返回 undefined,每次迭代都会设置 acc
= undefined。
当所有 4 次迭代都完成时,返回那个累加器。 (在这种情况下未定义)
示例 2:
const initialValue = 0
const answer = [1,2,3,4].reduce((acc, curr) =>
return acc - 2;
, initialValue);
console.log('answer: ', answer);
在第一次迭代中,acc
= 0 由于初始值但在本次迭代结束时,它返回一个值,即 0-2 = -2 . acc
设置为 -2。
第二次迭代,acc
-2 变为 -2-2 = -4。
第三次迭代,acc
-2 变为 -4-2 = -6。
第四次迭代,acc
-2 变为 -6-2 = -8。 (最后一次迭代,所以返回 `acc,我们得到 -8 作为最终结果)
由于我们使用箭头函数,您可以删除括号''''和'return
'关键字,将其写成单行为
const initialValue = 0
const answer = [1,2,3,4].reduce((acc, curr) => acc - 2 , initialValue);
console.log('answer: ', answer);
最后两段代码完全相同,只是语法糖不同。
希望对你有帮助,有任何问题欢迎提问。
【讨论】:
因为更清楚地表明“initialValue”是reduce
函数参数而不是“reducingFunction”的参数而升级【参考方案2】:
简单地说,reduce 接受多个值。第一个是前一个值(在本例中为 0),第二个是可比较值(newValue),然后是索引和数组。
const map1 = array1.reduce((prevValue, newValue) => newValue - 2, 0);
在此处阅读更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce
【讨论】:
【参考方案3】:这里没有什么奇怪的。看docs。
你在这里传递的是previousValue
(或accumulator
),初始值为0。每次迭代你只需忽略数组中的元素并返回previousValue - 2
。这里有 4 次迭代,所以返回值为 -8。
【讨论】:
以上是关于当我们传递一个带有一个参数的函数时,JavaScript 的 reduce 方法表现得很奇怪的主要内容,如果未能解决你的问题,请参考以下文章