为了账号安全,请及时绑定邮箱和手机立即绑定

减少方法不清楚

减少方法不清楚

GCT1015 2022-12-02 16:02:57
因此,我开始使用 reduce() 并意识到我可以将对象作为该方法的第一个元素传递,我看到了几个示例,这就是其中之一。const arr = ['y', 'n', 'y', 'y', 'n'];let test = arr2.reduce((sum, val) => {    sum[val] = (sum[val] || 0) + 1;    console.log('sum of val', sum[val], 'value', val)    return sum;}, {})我添加了那个控制台日志,这样我就可以看到发生了什么,但我无法弄清楚。方法是如何知道的?它如何在对象中添加 val(即 n 或 y),然后添加数组中存在的相同元素数量的总和。例如,该总和如何变为 {y: 20} - 假设数组中有 20 个 y。我对此感到困惑,起初它看起来很简单,但我想它不是。
查看完整描述

2 回答

?
胡说叔叔

TA贡献1804条经验 获得超8个赞

它不“知道”,你在这里sum[val] = (sum[val] || 0) + 1;

sum是第一次迭代中的空对象,然后它是从上一次迭代返回的对象(由于 是相同的return sum;)。Andval是当前值('y''n')。

因此,在第一次迭代中,sumwill be{}valwill be 'y'。然后这条线将设置sum['y'] = 1,因为它本质上是这样的sum['y'] = (sum['y'] || 0) + 1- 并且在那个点上,所以你会知道哪个是哪个。sum['y']undefined(undefined || 0) + 10 + 11

下一次发生同样的情况'n'

第三次,sum['y']已经1是以前的了,所以表达式变成(1 || 0) + 1which is 1 + 1which is 2,所以你得到sum['y'] = 2

等等。

从调试器中查看此截屏视频:https ://recordit.co/FVkXjW1b5y


查看完整回答
反对 回复 2022-12-02
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

.reduce()有两个参数

  • 回调函数

  • 初始值(可选)

在您的情况下,空对象文字{}是初始值。如果提供了初始值,它将作为第一个参数传递给回调函数

的回调函数的第二个参数是调用.reduce()数组的当前元素.reduce()。在第一次迭代中,valarr数组中的第一个元素,即'y'

sum[val] = (sum[val] || 0) + 1;

在每次迭代中,上面的语句将添加值val作为sum对象中的键(初始值),其值是0 + 1ifsum[val]未定义或sum[val] + 1ifsum[val]已定义。

你的代码是如何执行的:

第一次调用 callback 时,sumis{}valis 'y'。因为sum[val]orsum['y']undefined,'y'被添加为 keysum并且它的值为 1。当回调函数被第二次调用时同样的事情发生。2个电话后,sum看起来像{ y: 1, n: 1 }

在第三次调用中,因为sum[val]等于1,所以之前添加的键y被覆盖,sum[val] + 1其计算结果为1 + 1。所以在第三次通话后,sum看起来像{ y: 2, n: 1 }。在随后的回调函数调用中也会发生同样的事情。


查看完整回答
反对 回复 2022-12-02
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号