我试图找到一个解决方案,以找出一个数组中数字的出现次数,结果发现了以下解决方案:

const occurrences = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4].reduce(function (acc, curr) {
  return acc[curr] ? ++acc[curr] : acc[curr] = 1, acc
}, {});

console.log(occurrences)

上面的代码按预期工作.但我不能正确地理解它是如何工作的.有没有人能简单解释一下上面的归约方法?先谢谢你.

推荐答案

JAVASCRIPT中的reduce()方法用于迭代数组,并根据某些逻辑从数组中累加单个值.

让我们来分析一下代码:

const occurrences = [5, 5, 5, 2, 2, 2, 2, 2, 9, 4].reduce(function (acc, curr) {
    return acc[curr] ? ++acc[curr] : acc[curr] = 1, acc
}, {});

reduce()方法有两个参数:

array的每个元素上执行的function.这个function接受两个参数:accumulator(acc)和正在处理的当前值(curr).accumulator是在function的每次迭代中返回和累加的值.

accumulator的可选初始值.在这种情况下,初始值是空对象{}.

让我们来看看作为第一个参数传递给reduce()function:

function (acc, curr) {
  return acc[curr] ? ++acc[curr] : acc[curr] = 1, acc
}

在每次迭代中,该函数判断当前值(curr)是否已作为关键字存在于累加器(acc)中.如果是,则递增key中的value.如果不是,则将key加到value为1的累加器上.

拆解一下逻辑:

return acc[curr] ? ++acc[curr] : acc[curr] = 1, acc
  • acc[curr] ?:这判断电流value(curr)是否作为key存在于累加器(acc)中.

  • ++acc[curr]:如果键存在,则递增与该key相关联的值.

  • : acc[curr] = 1:如果key不存在,则将key与累加器相加,值为1.

  • , acc:最后,返回更新后的累加器.

在每次迭代中,reduce()方法要么递增现有数字的计数,要么将acc对象中新数字的计数初始化为1.

在所有迭代完成后,累加器对象的最终值被赋给事件变量并打印到控制台:

console.log(occurrences) // {2: 5, 4: 1, 5: 3, 9: 1}

这表明在原始数组中,数字2出现5次,数字5出现3次,数字4出现1次,数字9出现1次.

Javascript相关问答推荐

使用Apps Script缩短谷歌表中的URL?

在NextJS中使用计时器循环逐个打开手风琴项目?

使用JavaScript单击上一个或下一个特定按钮创建卡滑动器以滑动单个卡

如何在表格上拥有水平滚动条,在正文页面上拥有垂直滚动条,同时还对html表格的标题使用位置粘性?

未捕获错误:在注销后重定向到/login页面时找不到匹配的路由

在vercel throws上部署带有gunjs的sveltekit应用无法找到模块./' lib/文本编码'

将自定义排序应用于角形数字数组

在这种情况下,如何 for each 元素添加id?

在我的html表单中的用户输入没有被传送到我的google表单中

如何在coCos2d-x中更正此错误

您能在卸载程序(QtInsteller框架)上添加WizardPage吗?

使用领域Web SDK的Vite+Vue应用程序中的Web程序集(WASM)错误

将内容大小设置为剩余可用空间,但如果需要,可在div上显示滚动条

如何在 Select 文本时停止Click事件?

使用Ace编辑器对子组件实例的native-element 进行Angular 获取时面临的问题

警告框不显示包含HTML输入字段的总和

通过跳过某些元素的对象进行映射

构建器模式与参数对象输入

如何压缩图像并将其编码为文本?

如何在移动设备中使用JAVASSCRIPT移除点击时的焦点/悬停状态