Javascript 使用map仅对通过条件的元素求和

Javascript 使用map仅对通过条件的元素求和,javascript,arrays,conditional-statements,Javascript,Arrays,Conditional Statements,我有两个数组: teamA=[97112101] teamB=[109,95,123] 数组中的每个元素都是特定团队在一场比赛中的得分。我需要设置一个条件,只对100分以上的分数求和。因此,对于一个团队来说,条件是:如果一个团队的得分高于100,则该团队的得分与另一个团队的得分之和也高于100,并且如果该得分之和高于另一个团队的得分之和,则该团队获胜 我认为,通过映射,我可以获得100分以上的分数,但我得到了一个新数组,它的第一个元素是undefined 我的代码示例: const dolphi

我有两个数组:
teamA=[97112101]
teamB=[109,95,123]

数组中的每个元素都是特定团队在一场比赛中的得分。我需要设置一个条件,只对100分以上的分数求和。因此,对于一个团队来说,条件是:如果一个团队的得分高于100,则该团队的得分与另一个团队的得分之和也高于100,并且如果该得分之和高于另一个团队的得分之和,则该团队获胜

我认为,通过映射,我可以获得100分以上的分数,但我得到了一个新数组,它的第一个元素是undefined

我的代码示例:

const dolphinsGames = [97, 112, 101];
const koalasGames = [109, 95, 123];

const dolphinsScoreAbove = dolphinsGames.map((dolphinsGame) => {
if (dolphinsGame >= 100) {
    return dolphinsGame;
}
});
const koalasScoreAbove = koalasGames.map((koalasGame) => {
if (koalasGame >= 100) {
   return koalasGame;
}
});
结果是:

返回与数组长度相同的新数组,并获取每个项的回调结果

相反,您可以选择哪个过滤器来过滤数组并返回项目,具体取决于过滤器函数

const
有效=分数=>分数>=100,
加法=(a,b)=>a+b,
dolphinsGames=[97112101],
koalasGames=[109,95,123],
DolphinsCore=dolphinsGames.filter(有效).reduce(相加,0),
koalasScore=koalasGames.filter(有效)。reduce(添加,0);
控制台日志(dolphinsScore,Koalascore);
if(dolphinsScore===koalascore)console.log('draw');
else if(dolphinsScore>koalasScore)console.log(“海豚赢了”);

else console.log(“考拉赢了”)根据您的评论,这是您需要的吗?虽然没有使用地图:(

constdolphinsgames=[97112101];
康斯特·考拉斯加梅斯=[109,95,123];
常数平均=arr=>arr.reduce((p,c)=>p+c,0)/arr.length;
常数dolphinsAvg=平均值(dolphinsGames);
const koalasAvg=平均值(koalasAvg);
如果(海豚囊>100&&koalasAvg>100){
if(dolphinsAvg==koalasAvg){
console.log('draw')
}
否则如果(多芬沙夫>科拉萨夫){
console.log(“海豚赢了”)
}
否则{
console.log('koalas win')
}
}
否则{
console.log('平均分数小于100')

}
映射始终创建一个长度相同的数组,映射每个条目。在您的情况下,映射函数在“else”情况下隐式返回undefined

解决此问题的一种方法是使用
flatMap

dolphinGames.flatMap((dolphinGame) => dolphinGame >= 100 ? dolpinGame : [])
编辑:
正如在注释中所讨论的,即使这个示例正在运行,更好的选项还是简单的
过滤器
,因为我们实际上并没有更改映射函数中的元素。

您可以使用filter()方法实现您想要的。与map()不同,过滤器回调函数期望返回true/false。因此,我将修改您的程序,如下所示:

constdolphinsgames=[97112101];
康斯特·考拉斯加梅斯=[109,95,123];
常量DolphinsCoreOver=dolphinsGames.filter((dolphinsGame)=>{
如果(海豚名>=100){
返回true;
}
返回false;
});
const koalascoreOver=koalasGames.filter((koalasGame)=>{
如果(游戏>=100){
返回true;
}
返回false;
});
控制台日志(上面的海豚);

console.log(KoalasscoreUp);
请添加预期结果以便清楚地理解…”仅使用map对通过条件的元素求和“
map
不是此作业的正确工具。循环是此作业的正确工具:
let count=0;for(const-game of-dolphinGames){if(game>=100){++count;}
有些人也会使用
reduce
但是在使用预定义reducer的函数编程之外,我不建议这样做——太容易出错。(但是FWIW:
让count=dolphinGames.reduce((game,count)=>{if(game>=100){++count;};return count;},0)
)比较球队的平均得分,以确定比赛的胜利者,并将其打印在控制台上。包括最低得分为100的要求。根据这一规则,一个球队只有在得分高于另一个球队,同时得分至少为100分的情况下才能获胜。我希望现在更好地理解这一点。@Vukasin-我恐怕不知道ot.我尝试了filter方法,效果很好。问题是为什么MAP函数没有按预期工作。MAP方法转换数组中的每个项,而filter方法用于选择数组中的某些项。但不满意的索引仍然作为空数组返回。使用筛选器是此用例的方法。它不是
[1,2,3].flatMap(n=>n>1?n:[])/[2,3]
flatMap
将扁平化空数组。您也可以在Mozilla文档上找到这种方法,但我同意在这种情况下,过滤器是更好的选择。