【问题标题】:How to filter a loop through local storage如何通过本地存储过滤循环
【发布时间】:2022-01-28 10:20:50
【问题描述】:

我正在尝试将链接添加到我的导航栏以查找用户进行的搜索,以及用户是否喜欢该链接。我目前想要实现的是,如果“过去搜索”部分已经包含当前搜索,则不要添加当前搜索以避免重复。我正在使用localStorage 将这些数据与字符串化数组(alreadySearched)一起存储,并检查该数组是否包含当前搜索;我的问题是该函数总是返回 false。 收藏夹下拉菜单也会发生同样的事情。我做错了什么?

这是我的代码:

// primary movie information (API #1)
var getMovie = function(title) {
  $("#result").addClass("hidden")
  $("#main").removeClass("hidden");
  $("#search-form").trigger("reset");
  //format the OMDB api url 
  var apiUrl = `http://www.omdbapi.com/?t=${title}&plot=full&apikey=836f8b0`
  //make a request to the url 
  fetch(apiUrl)
    .then(function(response) {
      // request was successful 
      if (response.ok) {
        response.json().then(function(movieData) {
          // console.log(movieData)
          var movieTitle = movieData.Title
          getMovieId(movieTitle);
          getSoundTrack(movieTitle);
          getTrailer(movieTitle);
          var movieObj = {
            title: movieTitle,
          }
          var pastSearches = loadPastSearches();
          var alreadySearched = false
          if (pastSearches) {
            pastSearches.forEach(s => {
              if (s.title === movieTitle) {
                alreadySearched = true;
              }
            })
          }
          if (!alreadySearched) {
            for (var item of pastSearches) {
              let searchEl = document.createElement("a")
              let pastSearchTitle = item.title
              $(searchEl).text(pastSearchTitle)
              $(searchEl).addClass("past-search-item");
              $("#past-search-dropdown").append(searchEl)
              $(searchEl).click(function(e) {
                e.preventDefault();
                let title = pastSearchTitle
                getMovie(title)
                getQuotes(title)
              });
            }
          }
          saveSearch(movieObj)
          showMovie(movieData);
        });
      } else {
        alert("Error: title not found!");
      }
    })
    .catch(function(error) {
      alert("Unable to connect to CineXScore app");
      console.log(error)
    });
};


// save past search
var saveSearch = function(movieObj) {
  var pastSearches = loadPastSearches();
  pastSearches.push(movieObj);
  localStorage.setItem("movieObjects", JSON.stringify(pastSearches))
}
loadPastSearches = function() {
  var pastSearches = JSON.parse(localStorage.getItem("movieObjects"));
  if (!pastSearches || !Array.isArray(pastSearches)) {
    var pastSearches = []
  }
  return pastSearches;
}
// dropdown favorite soundtrack buttons 
var saveTrack = function(trackObj) {
  var faveTracks = JSON.parse(localStorage.getItem("trackObjects"));
  if (!faveTracks || !Array.isArray(faveTracks)) {
    var faveTracks = []
  }
  var alreadySearched = false
  if (faveTracks) {
    faveTracks.forEach(t => {
      if (t.name === trackObj.name) {
        alreadySearched = true;
      }
    })
  }
  if (!alreadySearched) {
    let trackEl = document.createElement("a")
    $(trackEl).addClass("fave-track");
    $(trackEl).text(trackObj.name);
    $(trackEl).attr("href", trackObj.url);
    $(trackEl).attr("target", "_blank")
    $("#favorite-tracks-dropdown").append(trackEl)
  }
  faveTracks.push(trackObj);
  localStorage.setItem("trackObjects", JSON.stringify(faveTracks))
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!-- Navigation Menu -->
<nav class="navbar navbar-default navbar-fixed-top">
  <a id="logo" class="navbar-brand">CineXScore</a>
  <div class="dropdown navbar-brand">Past Searches
    <i class="fa fa-caret-down"></i>
    <div id="past-search-dropdown" class="dropdown-content">
      <a id="clear-searches">Clear</a>
    </div>
  </div>
  <div class="dropdown navbar-brand">Favorite Tracks
    <i class="fa fa-caret-down"></i>
    <div id="favorite-tracks-dropdown" class="dropdown-content">
      <a id="clear-favorites">Clear</a>
    </div>
  </div>
</nav>

【问题讨论】:

  • “不起作用”是什么意思?预期的结果是什么,而您得到了什么?
  • 它会重新添加本地存储中的所有元素,无论标题是否已被搜索(因此,如果您搜索“泰坦尼克号”两次,那么它将在下拉列表中两次)跨度>
  • 目前我还没有明确的解决方案,但我想指出代码存在一些问题。首先,loadPastSearches 应该使用声明符(例如 var)并将其放在其他函数之前,或者简单地使用 function loadPastSearches() {...} 声明它。其次,每当你有一个 if 语句来检查本地存储项是否是一个数组时,你就是在你想要更改的变量中添加一个var,从而声明一个新的变量来执行谁知道什么。最后,console.log 是你的朋友(用于调试)。
  • 感谢您的帮助!如果我将“var”更改为这样,是否可以解决您提到的问题之一? ` var loadPastSearches = function() { let pastSearches = JSON.parse(localStorage.getItem("movieObjects")); if (!pastSearches || !Array.isArray(pastSearches)) { pastSearches = [] } return pastSearches; }`
  • 不,我的意思是声明符(即varletconst)将“重新声明”一个变量,这肯定不会如你所愿.您应该在我描述的区域中删除它,因为您已经声明了变量,所以您实际上可以改变变量。

标签: javascript html jquery local-storage


【解决方案1】:

这是一个简单的实现,我认为可能会对您有所帮助。

async function fetchMovie(movieTitle) {
  const apiUrl = `http://www.omdbapi.com/?t=${movieTitle}&plot=full&apikey=836f8b0`;

  let res = await fetch(apiUrl);
  res = await res.json();

  const title = res.Title;
  saveSearch(title); //   Should only pass the string:title
}

fetchMovie('spiderman');

function saveSearch(title) {
  if (!localStorage.getItem('movies')) localStorage.setItem('movies', ''); //   Initialize the localStorage

  //   e.g: (In localStorage)
  //   Avenger,Spiderman,The Antman etc..
  //   return this string & convert into an array

  let movies = localStorage
    .getItem('movies')
    .split(',')
    .filter((n) => n);

  //   Check if the title is already exists
  if (!movies.includes(title)) {
    movies.push(title);
  }

  //   Also store in localStorage as a string seperated by commas (,)
  movies = movies.join(',');

  localStorage.setItem('movies', movies);
}

【讨论】:

  • 感谢您的帮助!我会试试看!
猜你喜欢
  • 2017-08-10
  • 2017-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
相关资源
最近更新 更多