选择一条线进行改进。初学者效率代码题

Pick one line to improve. Beginner efficiency code question

我得到了 BigO Notation 的作业,我们应该为每个练习改进一组代码,但我在最后一个问题上遇到了麻烦。为此,他们希望我们通过更改一行代码来提高代码效率,最多更改两行。当我 运行 通过 VSCode 时,它告诉我 .values 在对象类型上不存在,所以我假设要提高效率,它与该行有关但不确定要更改什么。

let myMovies = [
  {
      "title":"Rush Hour 2",
      "year":2001,
      "cast":[
          "Jackie Chan",
          "Chris Tucker"
      ],
      "genres":[
          "Comedy"
      ]
  },
  {
      "title":"The Safety of Objects",
      "year":2001,
      "cast":[
          "Glenn Close",
          "Dermot Mulroney",
          "Patricia Clarkson"
      ],
      "genres":[
          "Drama"
      ]
  },
  {
      "title":"Rush Hour 2",
      "year":2001,
      "cast":[
          "Jackie Chan",
          "Chris Tucker"
      ],
      "genres":[
          "Comedy"
      ]
  },
  //etc...
]


function removeDuplicates(movies) {
  
  let indexedMovies = {};

  movies.forEach( (movie) => {
      if (Object.keys(indexedMovies).indexOf(movie.title) < 0) {
          indexedMovies[movie.title] = movie;
      }
  })

  return indexedMovies.values();
}

let fixedMovies = removeDuplicates(myMovies);

1) 无需搜索已有的电影片名 as

Object.keys(indexedMovies).indexOf(movie.title) < 0

因为它会花费 O(n) 并增加复杂性,您可以直接检查是否存在(如果您愿意)

!indexedMovies[movie.title]

任何你甚至可以省去这个过程并直接赋值movie

 indexedMovies[movie.title] = movie;

2) indexedMovies 对象上 values() 上没有这样的方法。 return indexedMovies 对象或其值为

Object.values(indexedMovies)

let myMovies = [{
    title: "Rush Hour 2",
    year: 2001,
    cast: ["Jackie Chan", "Chris Tucker"],
    genres: ["Comedy"],
  },
  {
    title: "The Safety of Objects",
    year: 2001,
    cast: ["Glenn Close", "Dermot Mulroney", "Patricia Clarkson"],
    genres: ["Drama"],
  },
  {
    title: "Rush Hour 2",
    year: 2001,
    cast: ["Jackie Chan", "Chris Tucker"],
    genres: ["Comedy"],
  },
  //etc...
];

function removeDuplicates(movies) {
  let indexedMovies = {};

  movies.forEach((movie) => indexedMovies[movie.title] = movie);

  return Object.values(indexedMovies);
}

let fixedMovies = removeDuplicates(myMovies);
console.log(fixedMovies);
/* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */

.as-console-wrapper {
  max-height: 100% !important;
  top: 0;
}

我认为您将采用这部分代码:

  movies.forEach( (movie) => {
      if (Object.keys(indexedMovies).indexOf(movie.title) < 0) {
          indexedMovies[movie.title] = movie;
      }
  })

并替换为

  movies.forEach( (movie) => {
      indexedMovies[movie.title] = movie;
  })

因为当您执行 indexedMovies[movie.title] 时,它将替换任何现有的“重复项”,因此无需使用 if 语句中的所有代码显式检查它,这是非常低效的它自己的 -- 创建一个数组只是为了线性搜索该数组中的项目。