[英]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
的元素的数组。
这样,最后,您将获得数组中大多数时间出现的值。
在您给出的示例中,发生以下情况:
>=
) 最后,返回最后的结果。
arr.filter调用传递一个值,结果是一个仅包含该数字的数组。 对于原始数组中的所有项目,这将导致一个数组中只有一个项目,但400除外。400在该数组中是两次。
每当具有累加器值的数组的长度大于具有当前值的数组的长度时,都会返回累加器。 初始累加器值为零,比较值是[]和[500],并且500成为累加器值。
然后比较将在[500]和[450]之间,累加器保持在500。下一个是400,比较将变为[500]和[400,400]。 当前值获胜,累加器变为400。由于数组中没有其他值出现两次以上,因此reduce返回400。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.