JavaScript 使用过滤器和长度等高阶函数的多维数组

JavaScript multidimensional array using high order function like filter and length

我是 javascript 的新手,正在尝试弄清楚如何使用长度为 属性 的 HOF 来解决下面的问题 ,但无法做到.在我们 class 的讨论中,我和我的朋友们最终得到了使用计数器的其他解决方案。如果您能帮助解决使用长度或其他方法解决问题的方法,我们将不胜感激。谢谢!

问题: 此数组中的每个数组代表足球队中每个球员的年龄 过滤掉那些年龄超过 20 岁的球员少于 3 人的球队。 提示:您可以在其他 HOF 的回调中使用高阶函数 (HOF)。

测试用例: [[20,31,19,18,22],[20,31,16,21,21],[17,31,16,21,21],[18,19,19,20,32]] 到 [[20, 31, 16, 21, 21], [17, 31, 16, 21, 21]]

使用计数器的解决方案:

Let currTeam = [[20,31,19,18,22],[20,31,16,21,21],[17,31,16,21,21],[18,19,19,20,32]];

let newTeam  = currTeam.filter(team => {
  let count = 0;
  team.map(age => {
    if (age > 20) count++;
  })
  if (count >= 3) return team;
})

问题 - 如何将解决方案更改为使用长度 属性(其他 HOF 也很好)而不是使用计数器?目前我使用 HOFs - 过滤和映射。

过滤每个组,并检查过滤后的长度是否大于2。未通过测试的每个组将return false,并被主过滤器循环过滤:

const currTeam = [[20,31,19,18,22],[20,31,16,21,21],[17,31,16,21,21],[18,19,19,20,32]];

const newTeam  = currTeam.filter(team => 
  team.filter(age => age > 20).length > 2
);

console.log(newTeam);

如果你不会使用其他过滤器创建中间数组,你可以使用Array.reduce()来计算。逻辑运算 (age > 20) return 是一个布尔值,JS 在将它添加到数字时将其转换为 0 for false 和 1 for true

const currTeam = [[20,31,19,18,22],[20,31,16,21,21],[17,31,16,21,21],[18,19,19,20,32]];

const newTeam  = currTeam.filter(team => 
  team.reduce((count, age) => count + (age > 20), 0) > 2
);

console.log(newTeam);

备注:

  1. 使用Array.map() 来转换数组的项目,而不是为了计数等副作用。对于副作用,使用Array.forEach()team.forEach(age => { if (age > 20) count++; })
  2. Array.filter() 方法需要一个布尔值,因此在您的原始代码中您可以只使用 return count >= 3;