【问题标题】:Arrays and objects in localstorage not working本地存储中的数组和对象不起作用
【发布时间】:2016-02-21 07:31:04
【问题描述】:

我正在处理 TODO 列表,我正在尝试使用本地存储来完成这项工作。 但是我的代码中有一个问题我无法解决。

函数getTaskArray() 从键“tasks”下的本地存储中检索到数组。如果找不到它,它会创建一个新数组。

pushData() 函数应该将任务对象推入数组。但我收到以下错误:taskArray.push is not a function

我在下面附上了我的代码的 sn-p。

提前感谢您的帮助!

var taskArray;
function getTaskArray() {
    var taskArrayString = localStorage.getItem("tasks");
    if (taskArrayString !== null && typeof taskArrayString === "string") {
        taskArray = taskArrayString;
        console.log("Succesfully retrieved 'tasks' and contents.");
    } else {
        console.log("Succesfully retrieved 'tasks', contents were not a string or held no contents. Contents of 'tasks' reset to empty array");
        var emptyArray = JSON.stringify(new Array());
        localStorage.setItem("tasks", emptyArray);
        taskArray = localStorage.getItem("tasks");
    };
};

var taskString;

function pushData() {
    taskString = JSON.stringify(taskObject);
    taskArray = taskArray.push(taskString);
};

更新:

我的代码的完整版本:

// All functions
var taskFromHtml;
var priorityFromHtml;

function getTaskInput() {
    try {
        taskFromHtml = $("#taak").val();
        priorityFromHtml = $("#prioriteit").val();
        console.log("Succesfully retrieved data. Task: " + taskFromHtml + ". Priority: " + priorityFromHtml + ".");
    } catch(e) {
        console.log("Failed to retrieve data, unexpecter error.");
    };
};

var taskObject;
function taskToObject() {
    taskObject = {
        task: taskFromHtml,
        priority: priorityFromHtml,
        finished: false
    }; 
};

var taskArray;
function getTaskArray() {
    var taskArrayString = localStorage.getItem("tasks");
    if (taskArrayString !== null && typeof taskArrayString === "string") {
        taskArray = JSON.parse(taskArrayString); // <------
        console.log("Succesfully retrieved 'tasks' and contents.");
    } else {
        console.log("Succesfully retrieved 'tasks', contents were not a string or held no contents. Contents of 'tasks' reset to empty array");
        var emptyArray = JSON.stringify(new Array());
        localStorage.setItem("tasks", emptyArray);
        taskArray = localStorage.getItem("tasks");
        taskArray = JSON.parse(taskArray); // <------
    };
};

var taskString;

function pushData() {
    taskString = JSON.stringify(taskObject);
    taskArray = taskArray.push(taskString);
};

它是 HTML:

  <form id="todoInsert" action="#">
        <input type="text" name="task" id="taak">
        <select id="prioriteit">
            <option value="1">1</option>
            <option value="2">2</option>
            <option value="3">3</option>
            <option value="4">4</option>
            <option value="5">5</option>
        </select>

        <input type="submit" id="formSubmit">
    </form>
    <div id="addItem">+</div>

【问题讨论】:

  • taskObject 定义在哪里?
  • @BasvanStein 代码有点远,还没有开始调试。但是上面的sn-p中有一行代码:localStorage.setItem("tasks", []);
  • @DemiënDrost 好的,请务必在设置 localStorage 时也执行 JSON.stringify,请参阅我为您的固定代码更新的答案。
  • @hindmost var taskObject;函数 taskToObject() { taskObject = { 任务:taskFromHtml,优先级:priorityFromHtml,完成:false }; };

标签: javascript html arrays json local-storage


【解决方案1】:

您收到错误是因为您尝试对字符串而不是数组执行 push 函数。

当您从 localStorage 获取字符串时,您需要使用 JSON.parse() 对其进行解析。

taskArray = JSON.parse( localStorage.getItem("tasks"));

当您在if 部分成功接收时:

taskArray = JSON.parse(taskArrayString);

您的完整工作代码将是:

var taskArray;
function getTaskArray() {
    var taskArrayString = localStorage.getItem("tasks");
    if (taskArrayString !== null && typeof taskArrayString === "string") {
        taskArray = JSON.parse(taskArrayString); // <------
        console.log("Succesfully retrieved 'tasks' and contents.");
    } else {
        console.log("Succesfully retrieved 'tasks', contents were not a string or held no contents. Contents of 'tasks' reset to empty array");
        var emptyArray = JSON.stringify(new Array());
        localStorage.setItem("tasks", emptyArray);
        taskArray = localStorage.getItem("tasks");
        taskArray = JSON.parse(taskArray); // <------
    };
};

var taskString;

function pushData() {
    taskString = JSON.stringify(taskObject);
    taskArray.push(taskString); // <----- !No need to assign there.
};

在这里你可以看到一个工作的 JsFiddle:https://jsfiddle.net/txvp9uwc/2/

【讨论】:

  • 我明白你的意思。但是当我测试它时,在 pushData() 之后,当我查找 taskArray 的内容时,它返回“1”(不带引号)。并且 taskArray[0] 也不起作用。当我查看浏览器的 localStorage 时,它​​说它拥有关键:任务,价值:[]。
  • @DemiënDrost 这可能与您的其他代码有关,例如,我不知道 taskObject 是什么,所以我不知道如何解决这个问题。让我为你制作一个小提琴来展示这部分的工作原理。
  • @DemiënDrost,我在您的代码中发现了另一个错误,当您执行push 时,无需再次分配变量。只需taskArray.push(taskString); 就足够了。
  • 可能就是这样。我附上了我的整个代码。但我也会对此进行测试。您的最后一个建议解决了我的问题!非常感谢您的帮助。
【解决方案2】:

您只能将数据以字符串格式保存在本地存储中。您不能保存日期、数字或任何其他数据类型。为此,您可以将数据序列化和反序列化为 JSON 字符串,然后持久化数据。

有一些很棒的包装库可以为您做到这一点:https://github.com/nbubna/storehttps://github.com/marcuswestin/store.js/

更新

您需要在检索后反序列化您的字符串,然后才能使用它:

var taskArrayString = localStorage.getItem("tasks");
if (taskArrayString !== null && typeof taskArrayString === "string") {
    taskArray = JSON.parse(taskArrayString);   // deserializing here
    console.log("Succesfully retrieved 'tasks' and contents.");
}

【讨论】:

  • 好吧,如您所见,我有一些 JSON 字符串。但显然某处存在某种问题。我宁愿在 JavaScipt 中解决这个问题,然后添加另一个库
猜你喜欢
  • 1970-01-01
  • 2020-11-05
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多