减少ES6函数中的对象数组

时间:2020-02-17 21:53:24

标签: javascript

我对正在使用的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))

我在这里想念什么?

非常感谢

3 个答案:

答案 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));