使用Reduce和Filter JavaScript查找数组中的数字模式

时间:2017-08-25 13:59:25

标签: javascript arrays

我有这个功能:

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是一个可以测试它的工作码。

2 个答案:

答案 0 :(得分:1)

此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
  8. 最后,返回最后一个结果。

答案 1 :(得分:1)

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

只要具有累加器值的数组的长度比具有当前值的数组长,就返回累加器。初始累加器值为空,比较在[]和[500]之间,500变为累加器值。

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