首页 > 解决方案 > 检索数据和平均值的对象数组

问题描述

我刚刚开始学习 JavaSCript,但在这个练习中遇到了一些麻烦。我有一个对象数组,其中包含大约 250 个对象。其中有多部电影(我只粘贴了数组中的前 2 部电影,但结构相同):

创建一个 DramaMoviesRate() 函数,该函数接收一个数组作为参数,以获取所有戏剧电影的平均速率!让我们看看它是否比一般平均水平更好。

再次四舍五入到小数点后两位!

我的逻辑是:1)只选择包含字符串“戏剧”的电影,2)计算它们的平均值。

我的问题是:根据测试,我应该将所有内容存储到一个函数中。其次,当我尝试过滤戏剧电影时,我还会得到其他不包含该字符串的电影作为输出。请使用 JS ES5 语法,谢谢。

PS:我必须只使用我知道的方法:filter() map() reduce() sort() reverse() slice()

let movies = [
  {
    title: "The Shawshank Redemption",
    year: 1994,
    director: "Frank Darabont",
    duration: "2h 22min",
    genre: ["Crime", "Drama"],
    rate: 9.3,
  },
  {
    title: "The Godfather",
    year: 1972,
    director: "Francis Ford Coppola",
    duration: "2h 55min",
    genre: ["Crime", "Drama"],
    rate: 9.2,
  }
]

function howManyDrama(phDrama) {
  const drama = phDrama.filter(function (movie) {
    return (
  movie.genre.includes('Drama')
    );
  });
  return drama;
}   ==>//HERE I DON'T GET THE RIGHT OUTPUT


//console.log(movies)


function dramaMoviesRate(pdrama){
  const average = pdrama.reduce(function(acc, movie){ 
   return acc + movie.rate
   },0);
   return Math.round((average / pdrama.length) * 100) / 100;
}

-----------------------------------------------------------------
-----------------------------------------------------------------
 //I also thought to filter my drama movies and then store the //function that has an array as output as argument of my second //function like this:

function howManyDrama(phDrama) {   //thats the fist to filter //drama with incorrect output
  const drama = phDrama.filter(function (movie) { 
    return (
  movie.genre.includes('Drama')
    );
  });
  return drama;
}
  
function dramaMoviesRate(howManyDrama){
  const average = howManyDrama.reduce(function(acc,movie){
  return acc.movie.rate
  },0);
  return Math.round((average / howManyDrama.length) * 100) / 100

}


howManyDrama(movies)

dramaMoviesRate(howManyDrama)

请使用 ES5 语法。谢谢你的耐心!

标签: arraysfunctionobjectmethods

解决方案


我跑了你的代码。戏剧过滤器工作正常。我更新了总计过程以更清洁。我无法让 reduce 方法正常工作,所以我使用 map 代替。

试试这个代码:

let movies = [
  {
    title: "The Shawshank Redemption",
    year: 1994,
    director: "Frank Darabont",
    duration: "2h 22min",
    genre: ["Crime", "Drama"],
    rate: 9.3,
  },
  {
    title: "The Godfather",
    year: 1972,
    director: "Francis Ford Coppola",
    duration: "2h 55min",
    genre: ["Crime", "Drama"],
    rate: 9.2,
  },
  {
    title: "Mission Impossible",
    year: 1999,
    director: "zzz",
    duration: "2h 55min",
    genre: ["Action"],
    rate: 7.2,
  }
]

function howManyDrama(phDrama) {
  const drama = phDrama.filter(function (movie) {
    return (
      movie.genre.includes('Drama')
    );
  });
  return drama;
}  


function dramaMoviesRate(pdrama){
  let total = 0
  let result = pdrama.map(x => total += x.rate);
  return total/pdrama.length
}

let m = howManyDrama(movies)
console.log(m)  //correct

let r = dramaMoviesRate(m)
console.log(r)  // correct


// do everything in single function
function dramaRate(movielist) {
  const drama = movielist.filter(function (movie) {
    return (
      movie.genre.includes('Drama')
    );
  });
  let total = 0
  let result = drama.map(x => total += x.rate);
  return total/drama.length
}

console.log(dramaRate(movies))  //single function call

推荐阅读