选择一条线进行改进。初学者效率代码题
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
语句中的所有代码显式检查它,这是非常低效的它自己的 -- 创建一个数组只是为了线性搜索该数组中的项目。
我得到了 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
语句中的所有代码显式检查它,这是非常低效的它自己的 -- 创建一个数组只是为了线性搜索该数组中的项目。