Javascript — неопределенный не является функцией

#javascript #jquery

#javascript #jquery

Вопрос:

В настоящее время я работаю над проектом, в котором я должен загрузить массив из localStorage и из этого цикла через него сгенерировать элементы.

У меня процесс сохранения работает должным образом, однако, когда дело доходит до его загрузки, я получаю следующую ошибку.

 TypeError: undefined is not a function (evaluating 'mainInfo.forEach')
  

Ниже вы можете увидеть код, который выдает эту ошибку.

 var mainInfo = [];
var subInfo = [];
mainInfo = localStorage.StaffAppMainList;
subInfo = localStorage.StaffAppSubList;
finalOutput = "";
console.log(mainInfo.length);
mainInfo.forEach(function(item) {
    var theTitle = item.title;
    var url = "Pages/SubInfo.html?info="   theTitle;
    finalOutput = finalOutput   "<li><a href='"   url   "'>"   item.title   "</a></li>";
    $("#homeList").html(finalOutput).listview().listview("refresh");
});
  

Строка, в которой выдается ошибка, является —

 mainInfo.forEach(function(item) {
  

В настоящее время я не уверен в том, что вызывает эту ошибку, и поэтому буду признателен за любой совет.

Комментарии:

1. В каком браузере и версии вы это проверяете?

2. не могли бы вы, пожалуйста, создать демонстрационную скрипку, где мы могли бы увидеть проблему?

Ответ №1:

Локальное хранилище (также известное как веб-хранилище) хранит только строки. Если вы хотите сохранить массив, вы можете закодировать его в JSON перед сохранением и декодировать при извлечении.

 // storing
var mainInfo = [];

localStorage.setItem("StaffAppMainList", JSON.stringify(mainInfo));

// retrieving
mainInfo = JSON.parse(localStorage.StaffAppMainList);
  

Если вы попытаетесь сохранить что-либо, что не является строкой, будет сохранена пустая строка, отсюда и ошибка, поскольку у строк нет forEach метода.

Комментарии:

1. Ах, это проясняет ситуацию. Не знал, что localStorage содержит только строки. Спасибо!

Ответ №2:

Это потому, что typeof mainInfo === 'string' . localStorage хранит строки. Вам нужно его как-то разобрать. Например, если mainInfo был сериализован в JSON. Вам нужно JSON.parse(mainInfo).forEach(..)