繁体   English   中英

使用减少和过滤JavaScript在数组中查找数字模式

[英]Finding Mode of Numbers in Array With Reduce and Filter JavaScript

我有这个功能:

const mode = arr =>
  arr.reduce(
    (a,b,i,arr) => (arr.filter(c=> c === a).length >= arr.filter(c => c === b).length) ? a : b,  
    null
  )

console.log(mode([500, 450, 400, 400, 375, 350, 325, 300])) // 400

我可以看到reduce函数接受两个参数,第一个为函数,第二个为null。 第一个参数函数将返回看起来像应该导致三元条件检查的结果,如果返回的左数组大于或等于右边的返回数组。

我仍然不太清楚引擎盖下到底发生了什么,并希望有人可以以一种易于解释的方式进一步分解这一点。 如果数组中的模式只有一个数字,这似乎是可行的,目前还可以,我以后可以解决这个问题。

是一个工作的Codepen进行测试。

该reduce函数从数组中获取两个元素,并将该函数应用于它们。 然后将其应用于结果和下一个元素,对arr所有元素依此类推。

该函数比较数组中“ a”和“ b”的出现次数,并返回出现次数最多的两个。

出现次数是由filter(c => c === a) ,这意味着-返回仅包含等于a的元素的数组。

这样,最后,您将获得数组中大多数时间出现的值。

在您给出的示例中,发生以下情况:

  1. #of 500s vs #of 450s ==>产生500(因为>=
  2. #of 500s vs #of 400s ==>产生400(400次出现两次)
  3. #of 400s vs #of 400s ==>产生400
  4. #of 400s vs #of 375s ==>产生400
  5. #of 400s vs #of 350s ==>产生400
  6. #of 400s vs #of 325s ==>产生400
  7. #of 400s vs #of 300s ==>产生400

最后,返回最后的结果。

arr.filter调用传递一个值,结果是一个仅包含该数字的数组。 对于原始数组中的所有项目,这将导致一个数组中只有一个项目,但400除外。400在该数组中是两次。

每当具有累加器值的数组的长度大于具有当前值的数组的长度时,都会返回累加器。 初始累加器值为零,比较值是[]和[500],并且500成为累加器值。

然后比较将在[500]和[450]之间,累加器保持在500。下一个是400,比较将变为[500]和[400,400]。 当前值获胜,累加器变为400。由于数组中没有其他值出现两次以上,因此reduce返回400。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM