修改1-2行JS代码优化电影去重函数的BigO效率并修复报错
问题解决方案
报错原因
普通JavaScript对象不存在实例方法.values(),你调用indexedMovies.values()属于语法错误,JS提供了静态方法Object.values()用于获取对象的所有属性值数组。
效率优化点
原有判断去重的逻辑Object.keys(indexedMovies).indexOf(movie.title) < 0存在性能问题:
- 每次执行
Object.keys()都会遍历对象生成完整的键数组,再用indexOf()遍历数组查找目标值,单次判断时间复杂度为O(k)(k为当前已存储的电影数量) - 嵌套在遍历所有电影的forEach循环中,整体时间复杂度为O(n²)
优化方案利用对象属性访问O(1)的特性,直接判断title是否为对象的已有键即可,修改后整体时间复杂度降到O(n),完全符合BigO优化要求。
修改后的代码(仅改动2行,符合题目要求)
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) => { // 修改第1行:原判断逻辑替换为in操作符判断键是否存在 if (!(movie.title in indexedMovies)) { indexedMovies[movie.title] = movie; } }) // 修改第2行:替换为Object.values静态方法调用 return Object.values(indexedMovies); } let fixedMovies = removeDuplicates(myMovies);
补充说明:使用
in操作符判断键是否存在比直接判断!indexedMovies[movie.title]更严谨,可以避免电影对象为假值(null/undefined)时的误判问题。
内容的提问来源于stack exchange,提问作者ArcRiseGen
相关产品推荐
相关产品推荐

