【问题标题】:Comparing object array with another array loop function将对象数组与另一个数组循环函数进行比较
【发布时间】:2020-06-21 09:00:48
【问题描述】:

很抱歉,这太长了,但我陷入困境并试图弄清楚为什么我没有得到价值。

这个函数应该返回作为参数给出的所有演员在其中表演的电影数量。

例如:findNumOfMoviesByActors(["Morgan Freeman", "Bob Gunton"]) 应该返回 1,因为只有一部电影同时包含(参见下面的数组)。

这是一大堆电影,但这是一个片段:

const movies = [
  {"title": "Beetlejuice",
    "actors": "Alec Baldwin, Geena Davis, Annie McEnroe, Maurice Page"},

  {"title": "The Cotton Club",
    "actors": "Richard Gere, Gregory Hines, Diane Lane, Lonette McKee"},

  {"title": "The Shawshank Redemption",
   "actors": "Tim Robbins, Morgan Freeman, Bob Gunton, William Sadler"},

  {"title": "Crocodile Dundee",
   "actors": "Paul Hogan, Linda Kozlowski, John Meillon, David Gulpilil"}]
 

这是我目前的代码:

const findNumOfMoviesByActors = actors => {
      for (i = 0; i < movies.length; i++) {
            movies[i].actors = movies[i].actors.split(' ')
        }
    
      for (i = 0; i < movies.length; i++) {
          let count = 0
          if (actors === movies[i].actors) {
              count++
          }
          return count
      }
  }
    
    const actorCheck = ["Paul Hogan", "Linda Kozlowski"]
    let test = findNumOfMoviesByActors(actorCheck)
    console.log(test)

【问题讨论】:

  • 需要用逗号分割并修剪,因为逗号现在是字符串的一部分。

标签: javascript arrays function loops object


【解决方案1】:

您需要用可能的空格分割字符串,因为您会为电影的第二个演员获得一个前导空格,然后您需要迭代想要的演员或给定的演员并计算电影的出现次数。

如果电影包含所有想要的演员,则增加电影计数。

const
    findNumOfMoviesByActors = actors => {
        let movieCount = 0;
        for (let i = 0; i < movies.length; i++) {
            let count = 0;
            for (const actor of movies[i].actors.split(/,\s*/)) {
                if (actors.includes(actor)) count++;
                if (count === actors.length) {
                    movieCount++;
                    break;
                }
            }                
        }
        return movieCount;
    },
    movies = [{ title: "Beetlejuice", actors: "Alec Baldwin, Geena Davis, Annie McEnroe, Maurice Page" }, { title: "The Cotton Club", actors: "Richard Gere, Gregory Hines, Diane Lane, Lonette McKee" },  { title: "The Shawshank Redemption", actors: "Tim Robbins, Morgan Freeman, Bob Gunton, William Sadler" },  { title: "Crocodile Dundee", actors: "Paul Hogan, Linda Kozlowski, John Meillon, David Gulpilil" }],
    actorCheck = ["Paul Hogan", "Linda Kozlowski"];
    
let test = findNumOfMoviesByActors(actorCheck);
console.log(test)

【讨论】:

  • 非常感谢!这非常清楚,非常有帮助
【解决方案2】:
movies.filter((m) => m.actors.contains("Morgan Freeman, Bob Gunton")).length

【讨论】:

  • 对不起,我即将进入学习JS的第二周,你刚刚写的对我来说没有意义。我会试着弄清楚。谢谢你的回答
  • 顺便说一句,它仅在字符串位于 actor 属性中时才有效。如果名称被切换,它就不起作用了。
  • @NinaScholz - 我同意。
  • 你可能想要.includes()而不是.contains()
  • 虽然此代码可以解决 OP 的问题,但最好包含关于您的代码如何解决 OP 问题的说明。这样,未来的访问者可以从您的帖子中学习,并将其应用到他们自己的代码中。 SO 不是编码服务,而是知识资源。此外,高质量、完整的答案更有可能获得支持。这些功能,以及所有帖子都是独立的要求,是 SO 作为一个平台的一些优势,使其与论坛区分开来。您可以编辑以添加其他信息和/或使用源文档补充您的解释。
【解决方案3】:

我找到了两种解决方法:

第一个使用函数式样式,因此不涉及手动编写任何循环。如果您只是学习 Javascript,确实需要一些时间来思考,但是一旦您了解了这个过程,您就可以将这种风格应用于几乎任何类型的问题。它值得学习,并且从长远来看将使编写 JS 应用程序变得更加容易。您只需要小心使用 sort() 方法,因为它会修改原始数组 - 所以请务必先复制它们:

const movies = [
    {"title": "Beetlejuice",
      "actors": "Alec Baldwin, Geena Davis, Annie McEnroe, Maurice Page"},
  
    {"title": "The Cotton Club",
      "actors": "Richard Gere, Gregory Hines, Diane Lane, Lonette McKee"},
  
    {"title": "The Shawshank Redemption",
     "actors": "Tim Robbins, Morgan Freeman, Bob Gunton, William Sadler"},
  
    {"title": "Crocodile Dundee",
     "actors": "Paul Hogan, Linda Kozlowski, John Meillon, David Gulpilil"}
    
]

const countMoviesFunctional = (arr) => {
    const moviesCopy = [...movies];
    const arrCopy = [...arr];
    return moviesCopy.map(movie => movie.actors.split(", ").sort().join("|")).filter(actorStr => actorStr.includes(arrCopy.sort().join("|"))).length;
}

console.log(countMoviesFunctional(["Paul Hogan", "Linda Kozlowski"]))

第二种方式使用命令式风格,并且与您最初尝试做的事情很接近。虽然作为初学者更容易理解,但到处写循环会让人感到困惑,并且经常会导致很多错误。它还使您的代码变得更加冗长,难以调试。最好尝试编写更多功能代码来避免这些问题。但这里仍然是代码:

const movies = [
    {"title": "Beetlejuice",
      "actors": "Alec Baldwin, Geena Davis, Annie McEnroe, Maurice Page"},
  
    {"title": "The Cotton Club",
      "actors": "Richard Gere, Gregory Hines, Diane Lane, Lonette McKee"},
  
    {"title": "The Shawshank Redemption",
     "actors": "Tim Robbins, Morgan Freeman, Bob Gunton, William Sadler"},
  
    {"title": "Crocodile Dundee",
     "actors": "Paul Hogan, Linda Kozlowski, John Meillon, David Gulpilil"}
    
]

const filterMoviesImperative = (arr) => {
    let count = 0;
    for(let i=0; i<movies.length; i++) {
        let containsAll = true;
        const actorsArr = movies[i].actors.split(", ");
        for(let j=0; j<arr.length; j++) {
            if(!actorsArr.includes(arr[j])) {
                containsAll = false;
                break;
            }
        }

        if(containsAll) count++;
    }

    return count;
}

console.log(filterMoviesImperative(["Paul Hogan", "Linda Kozlowski"]));

【讨论】:

    【解决方案4】:

    你需要用','分割然后修剪。比较很简单:获取所有给定的演员并检查它们是否存在于电影中,如果存在则将一个添加到计数器中。您甚至可以创建一系列电影标题并将其返回。我更改了电影数组中的演员,以便您可以有一个工作示例

    var movies = [
      {"title": "Beetlejuice",
        "actors": "Tim Robbins, Morgan Freeman, Annie McEnroe, Maurice Page"},
    
      {"title": "The Cotton Club",
        "actors": "Tim Robbins, Morgan Freeman, Diane Lane, Lonette McKee"},
    
      {"title": "The Shawshank Redemption",
       "actors": "Tim Robbins, Morgan Freeman, Bob Gunton, William Sadler"},
    
      {"title": "Crocodile Dundee",
       "actors": "Paul Hogan, Linda Kozlowski, John Meillon, David Gulpilil"}]
    
    function findNumOfMoviesByActors(actors) {
      for (i = 0; i < movies.length; i++) {
        movies[i].actors = movies[i].actors.split(',');
        for (j = 0; j < movies[i].actors.length; j++) {
          movies[i].actors[j] = movies[i].actors[j].trim();
        }
      }
      
      var res = [];
      var count = 0;
      for (i = 0; i < movies.length; i++) {
        var all = 0;
        for (var actor of movies[i].actors) {
          if (actors.includes(actor)) all++;
            if(all === actors.length) {
              count++;
              res.push(movies[i].title);
              break;
            }
          } 
        }
        return [res, count];
    }
    
    var actorCheck = ["Tim Robbins", "Morgan Freeman"];
    var test = findNumOfMoviesByActors(actorCheck);
    console.log(test);

    【讨论】:

      【解决方案5】:

      您可以使用 ES6 中的 filter()reduce() 运算符来获得所需的输出。下面给出了一种可能的方法

      const movies = [{
          "title": "Beetlejuice",
          "actors": "Alec Baldwin, Geena Davis, Annie McEnroe, Maurice Page"
        },
      
        {
          "title": "The Cotton Club",
          "actors": "Richard Gere, Gregory Hines, Diane Lane, Lonette McKee"
        },
      
        {
          "title": "The Shawshank Redemption",
          "actors": "Tim Robbins, Morgan Freeman, Bob Gunton, William Sadler"
        },
      
        {
          "title": "Crocodile Dundee",
          "actors": "Paul Hogan, Linda Kozlowski, John Meillon, David Gulpilil"
        }
      ];
      
      const findNumOfMoviesByActors = actors => {
        return movies.reduce((acc, movie) =>
          acc + ((actors.every(a =>
            movie.actors.split(/,\s*/g).includes(a)) && 1) || 0), 0)
      };
      
      
      console.log(findNumOfMoviesByActors(["Morgan Freeman", "Bob Gunton"]));

      【讨论】:

        猜你喜欢
        • 2018-08-04
        • 2017-04-27
        • 1970-01-01
        • 1970-01-01
        • 2019-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多