首先,举例说明我对功能的要求。一个学生数组被传递给该函数,该函数返回一个数组,其中每个学生的最高分作为项目。
getStudentTopScores([
{
id: 1,
name: "Jacek",
scores: [5, 3, 4, 2, 5, 5]
},
{
id: 2,
name: "Ewa",
scores: [2, 3, 3, 3, 2, 5]
},
{
id: 3,
name: "Zygmunt",
scores: [2, 2, 4, 4, 3, 3]
}
]) ➞ [5, 5, 4]
以下是我的工作职能。我需要一些帮助来解释其工作原理。
const getStudentTopScores=students=>
students
.map(student=>student.scores)
.reduce((arr,scores)=>{
const score = scores.length?Math.max(...scores):0;
arr.push(score);
return arr;
},[]);
那么,我的代码怎么了?
.map()方法应用于数组:
.map(student => student.scores) 我认为这是访问存储在学生内部的分数数组。
.reduce()方法应用于每个得分。这将获取每个分数并询问:此分数是数组中的最高分数吗?。如果答案为是,则该值存储在分数中(如果答案为否)。 ,那么0将存储在得分中。
得分中存储的值将添加到累加器( arr )。
该值是特定学生的最高分数。 如果多个分数相等且最高怎么办?为什么不将这些全部添加到累加器中,创建一个值,该值是该个人所有最高得分的总和?
该代码仅在末尾使用空数组。我不知道为什么需要这样做。请对此进行解释。
答案 0 :(得分:0)
地图将返回一个分数数组,
reduce将遍历数组数组,对于每个项目(一个分数数组),您选择一个元素(最大)并将其推入累加器,因此您的累加器每个元素只能有1个值。
reduce末尾的空数组是累加器的起始值。
您可以使用此功能获得相同的结果
s => s.map(c => Math.max(...c.scores))
答案 1 :(得分:0)
对于第五点中提到的问题:
如果有多个相等且最大的分数,则Math.max函数仅获取最大值,因此这些值不会添加到累加器中。
最后一个空数组将传递一个初始值,reduce的结果将被推入该初始值。
答案 2 :(得分:0)
Reduce函数可以循环数组中的每个对象,并将每次迭代的值存储到累加器对象,这是通过在迭代中返回值来实现的。
基本示例为
[1,2,3,4].reduce((accumulator, value) => {
return accumulator + value
})
// outputs 10
现在看这个例子
[1,2,3,4].reduce((accumulator, value) => {
return accumulator + value
}, 20)
// now the output 30, because the initial value of accumulator is set to 20
// so 20 + 1 + 2 + 3 + 4 = 30
现在在您的示例中为什么要添加[]。 因为默认情况下reduce的第一个参数是object。 因为在我的示例中添加了{} + 0 =0。所以Javascript duh!
但是在您的示例中,您正在将值推入累加器。
arr.push(highestValue)
继续,在浏览器中打开控制台,然后输入
{}.push(5)
push is not a function
在不使用[]的情况下运行reduce函数时将遇到的相同错误。 因此,我认为这一次您应该已经知道了,通过传递[],您可以将累加器值显式设置为array,而现在
arr.push()
有效
还有顺便说一句
Math.max
即使有多个相等的值,也只返回一个最大值。