一次尝试制作一部讨人喜欢的电影

Trying to make a movie likeable one time

我试图通过将电影存储在这样的数组中来让电影变得讨人喜欢:

let likedMovies = [];
const movieLike = document.getElementById("likeButton");
likedMovies = JSON.parse(localStorage.getItem("likedMovies"));
movieLike.addEventListener("click", () => {
  if (likedMovies.indexOf(allMovies[i].name) === -1) {
    confirm("Movie liked");
    axios.patch(`url`);
    likedMovies.push(allMovies[i].name);
    localStorage.setItem("likedMovies", JSON.stringify(likedMovies));
    return true;
  }
  confirm("Movie already liked");
  return false;
});

它在今天下午工作,但现在控制台显示一条错误日志,上面写着:“script.js:75 未捕获的类型错误:无法读取 null 的属性(读取 'indexOf') 在 HTMLDivElement。”并且当我记录我的 likedMovies 数组时,它说该数组为“空”,你能帮我理解为什么它不起作用吗?

问题是您正在使用 JSON.parse 的结果重新分配 likedMovies,如果无法解析它,则结果为 null。

let likedMovies = JSON.parse(localStorage.getItem("likedMovies")) || [];

这应该可以解决错误,但您也可以通过将其存储为对象来进行一些优化。

let likedMovies = JSON.parse(localStorage.getItem("likedMovies")) || {};
const movieLike = document.getElementById("likeButton");
movieLike.addEventListener("click", () => {
  if (likedMovies[allMovies[i].name]) {
    confirm("Movie liked");
    axios.patch(`url`);
    likedMovies[allMovies[i].name] = true;
    localStorage.setItem("likedMovies", JSON.stringify(likedMovies));
    return true;
  }
  confirm("Movie already liked");
  return false;
});

现在您的搜索将不会在 O(n) 的线性时间内发生,而是在常量 O(1) 内发生。微小的性能改进。