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