我有这个功能:
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。 第一个参数函数返回看起来应该导致三元条件检查的左侧数组 return大于或等于右侧返回的数组。
我仍然不清楚幕后真的发生了什么,并且希望有人能够进一步打破这种局面, 以一种容易解释的方式。如果只有一个数字是数组中的模式,这似乎有效,现在可以解决,我可以在以后解决这个问题。
Here是一个可以测试它的工作码。
答案 0 :(得分:1)
此reduce函数从数组中获取两个元素,并将函数应用于它们。然后它将它应用于结果和下一个元素,依此类推arr
的所有元素。
该函数比较数组中'a'和'b'的出现次数,并返回出现在两者中最多的那个。
出现次数由filter(c => c === a)
计算,这意味着 - 返回一个只包含等于a
的元素的数组。
这样,最终,您将得到数组中出现次数最多的值。
在您给出的示例中,会发生以下情况:
>=
)最后,返回最后一个结果。
答案 1 :(得分:1)
arr.filter调用传递一个值,结果是一个只有该数字的数组。对于原始数组中的所有项目,这将导致具有单个项目的数组,除了400. 400在数组中是两次。
只要具有累加器值的数组的长度比具有当前值的数组长,就返回累加器。初始累加器值为空,比较在[]和[500]之间,500变为累加器值。
然后比较将在[500]和[450]之间,累加器保持500.接下来是400,比较变为[500]和[400,400]。当前值获胜,累加器变为400.由于数组中没有其他值出现两次以上,因此reduce返回400.