减少方法不清楚

因此,我开始使用 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。


我对此感到困惑,起初它看起来很简单,但我想它不是。


GCT1015
浏览 99回答 2
2回答

胡说叔叔

它不“知道”,你在这里做: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

繁华开满天机

.reduce()有两个参数回调函数初始值(可选)在您的情况下,空对象文字{}是初始值。如果提供了初始值,它将作为第一个参数传递给回调函数。的回调函数的第二个参数是调用的.reduce()数组的当前元素.reduce()。在第一次迭代中,val是arr数组中的第一个元素,即'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 }。在随后的回调函数调用中也会发生同样的事情。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript