JavaScript reduce()仅考虑2个数组元素

时间:2019-03-14 18:25:42

标签: javascript arrays

我想获得某个阵列中所有“戏剧”电影的平均收视率。 所以我的计划是 1.)执行一些“过滤器”功能以获取所有“戏剧”电影的数组 2.)执行“减少”功能,该功能会累加所有额定值,并将返回值除以“戏剧”数组的长度。

但是第一步是有效的,但是当我尝试使用“ reduce”函数时,每当我的“ Drama”数组包含两个以上元素时,它将返回NaN。如果我用2个元素对其进行测试,那么它将起作用。我真的很困惑,由于某些原因,第三个元素的“比率”不再被视为数字值。

任何帮助表示感谢,谢谢!!

var movies = [{
    title: 'Fargo',
    year: '1994',
    director: 'Frank Darabont',
    duration: '2h 52min',
    genre: ['Drama'],
    rate: '7.78'
  },
  {
    title: 'Terminator',
    year: '1994',
    director: 'Frank Darabont',
    duration: '2h 52min',
    genre: ['Drama', 'Crime'],
    rate: '9.36'
  },
  {
    title: 'The Shawshank Redemption',
    year: '1994',
    director: 'Frank Darabont',
    duration: '2h 52min',
    genre: ['Drama'],
    rate: '8.5'
  },
  {
    title: 'Titanic',
    year: '1994',
    director: 'Frank Darabont',
    duration: '2h 52min',
    genre: ['Romance'],
    rate: '2.5'
  }
]

function dramaMoviesRate(arr) {
  let drama = (arr.filter(movie => movie.genre.includes('Drama')))
  if (drama.length >= 2) {
    const total = drama.reduce((accumulator, currentValue) => parseFloat(accumulator.rate) + parseFloat(currentValue.rate))
    return Math.round((total / drama.length) * 100) / 100
  } else if (drama.length === 1) {
    return (parseFloat(drama[0].rate))
  }
}
console.log(dramaMoviesRate(movies))

1 个答案:

答案 0 :(得分:5)

Array#reduce中将initial value设置为0并仅解析下一个值(currentValue.rate),否则,在第二次迭代开始,accumulator.rate将是{{3 }},返回值为undefined

const total = drama.reduce((accumulator, currentValue) =>  accumulator + parseFloat(currentValue.rate), 0)