我对正在使用的reduce函数有些困惑。我打算减少一个对象数组,如果我声明一个变量并将其设置为reduce迭代,则该数组就可以了:
movies = [
{
title: 'The Shawshank Redemption',
rate: '9.3'
},
{
title: 'The Godfather',
rate: '9.2'
},
{
title: 'The Godfather: Part II',
rate: '9.0'
}
]
const averageRating = movies.reduce((sum, current) => {
return (sum + parseFloat(current.rate)) / 3;
}, 0);
console.log(averageRating)
但是,如果我尝试将其编写为ES6函数,它会告诉我未定义总和:
movies = [
{
title: 'The Shawshank Redemption',
rate: '9.3'
},
{
title: 'The Godfather',
rate: '9.2'
},
{
title: 'The Godfather: Part II',
rate: '9.0'
}
]
ratesAverage = (array) => {
array.reduce((sum, movies) => {
return sum + parseFloat(movies.rate);
}, 0)
}
console.log(ratesAverage(movies))
我在这里想念什么?
非常感谢
答案 0 :(得分:1)
如果将箭头函数用大括号括起来,则需要return
语句。
仅当省略大括号时,表达式的值才隐式返回。
movies = [
{
title: 'The Shawshank Redemption',
rate: '9.3'
},
{
title: 'The Godfather',
rate: '9.2'
},
{
title: 'The Godfather: Part II',
rate: '9.0'
}
]
ratesAverage = (array) => {
return array.reduce((sum, movies) => {
return sum + parseFloat(movies.rate);
}, 0)
}
console.log(ratesAverage(movies))
答案 1 :(得分:1)
因为您没有在函数中返回任何值
ratesAverage = (array) => {
return array.reduce((sum, movies) => {
return sum + parseFloat(movies.rate);
}, 0)
}
只需将return
添加到reduce
方法的结果中即可。
或,您可以删除括号以隐式返回
ratesAverage = (array) => array.reduce((sum, movies) => {
return sum + parseFloat(movies.rate);
}, 0)
答案 2 :(得分:1)
当您尝试使用ES6 Arrow function
时,如果您使用直接更改,请尽量不要使用return,因为这是使用箭头功能的优势之一。
对于reduce
,每次迭代都需要返回该值,因此它将在累加器中更新,否则它将被视为未定义。
检查MDN以获得有关reduce的更多详细信息
您可以使用如下一行代码。
movies = [
{ title: 'The Shawshank Redemption', rate: '9.3' },
{ title: 'The Godfather', rate: '9.2' },
{ title: 'The Godfather: Part II', rate: '9.0' }
];
ratesAverage = list => list.reduce((acc,movie) => ((acc + parseFloat(movie.rate))/3), 0);
console.log(ratesAverage(movies));