【问题标题】:JS: Multiple objects in an array stored in local storageJS:存储在本地存储中的数组中的多个对象
【发布时间】:2018-10-05 19:18:24
【问题描述】:

我一整天都在尝试这样做,但无法做到。我在各种网站上阅读了许多文章并尝试了许多不同的方法,但我仍然遇到这样或那样的问题。

对不起,如果有点随意,我正在努力解决我的问题,所以我正在努力寻找寻求帮助的领域。

组件目标: 存储在 LS 上的数组,用于保存对象,保存有关节目的信息 组件问题:根据代码,我似乎要么覆盖单个对象,不能记录超过 2 个对象(然后相互覆盖),要么在存储 1 个对象后,数组开始弄乱更多条目。

TLDR:

我现在要做的就是:

-将新对象推入新的 showList 数组

-从 LS 中的 showList 数组中拉出我的对象(如果存在),推入新的 showList

-stringify,然后将我的新组合数组推入 LS

下面是相关函数。

function addNewShow(titleArg, typeArg, genreArg, watchedArg) {
  var showList = [];

  var show = {
    title: titleArg,
    type: typeArg,
    genre: genreArg,
    watched: watchedArg
  };
  showList.push(show);
  showList.push(JSON.parse(localStorage.getItem('showList')));
  console.log(showList);


  localStorage.setItem("showList", JSON.stringify(showList));
};

如果您想查看该项目,可以在此处查看:https://codepen.io/11PH/pen/NONJBa?editors=1011

非常感谢任何帮助,在此先感谢您。

【问题讨论】:

    标签: javascript json local-storage


    【解决方案1】:

    您将从本地存储接收的整个数组推入本地 showList 数组的第二个位置,您应该使用数组串联:

    localStorage.removeItem('showList');
    
    function addNewShow(titleArg, typeArg, genreArg, watchedArg) {
      var showList = [];
    
      var show = {
        title: titleArg,
        type: typeArg,
        genre: genreArg,
        watched: watchedArg
      };
      showList.push(show);
      showList = showList.concat(JSON.parse(localStorage.getItem('showList')||'[]'));
      console.log(showList);
    
    
      localStorage.setItem("showList", JSON.stringify(showList));
    };
    
    addNewShow(1,2,3,4);
    addNewShow(1,2,3,5);
    addNewShow(1,2,3,6);
    addNewShow(1,2,3,7);
    

    小 sn-p 说明为什么 (jsonString||"[]") 很重要:

    var array = [1,2,3,4];
    console.log("array is:");
    console.log("\t",  array ); 
    console.log("concating null adds new null element to the array");
    console.log("\t",  array.concat(null) ); 
    console.log("concating empty array deosn't change anything");
    console.log("\t",  array.concat([]) );
    console.log("result of expresion (null||[]) is empty array not null");
    console.log("\t", null||[]);
    console.log("puting it all together, if we don't want to add null to the array then we can write   array.concat( null||[] )");
    console.log("\t",  array.concat( null||[] ) ); 
    
    console.log('additionaly JSON.parse(null) in null');
    console.log("\t",  JSON.parse(null) ); 

    Array.concat 就是这样工作的 - MDN 是文档和示例的重要来源 - here for concat

    【讨论】:

    • 我尝试过连接,一定是在某个地方搞砸了。你能解释一下'|| '[]'" 你写的?我以为是创建要存储的数组,但使用 var showList = [];
    • localStorage.getItem('showList')||'[]')是当本地存储中的showList项的值为null时获取数组。如果它为空,那么我们在字符串 "[]" 上运行 JSON.parse - 返回空表并保证将参数传递给 showList.concat( parameter i> ) 始终是数组。
    • 为什么它会在任何条目之前为空?它只是一个安全网吗?
    • 在 localStorage 中的项目初始化之前将为 null(运行 localStorage.getItem('asdjbsdfhbj') 并检查结果),如果我没有将 null 更改为空数组 concat 将添加 null 作为最后一个元素排列。我正在添加sn-p来回答以说明它,请稍等。
    • 这真的很有帮助,谢谢,这个例子很棒。我仍然难以理解的是为什么 concat 添加 null ?如果我要绕圈子,我想我会更多地研究 concat。
    【解决方案2】:

    您应该先从 localStorage 读取 showList,然后将 show 推送到该数组。

    function addNewShow(titleArg, typeArg, genreArg, watchedArg) {
      // Get array from local storage, defaulting to empty array if it's not yet set
      var showList = JSON.parse(localStorage.getItem('showList') || "[]");
    
      var show = {
        title: titleArg,
        type: typeArg,
        genre: genreArg,
        watched: watchedArg
      };
      showList.push(show);
      localStorage.setItem("showList", JSON.stringify(showList));
    };

    【讨论】:

    • 嘿,谢谢,这似乎是一个干净的修复谢谢,我想我的东西顺序错误。这有助于解释 ` || “[]”`有点也。是否为第一个条目实施?因为在任何条目之前不会有一个数组。
    • 对。当还没有 LS 项时,getItem 返回null,所以我们默认使用"[]"
    【解决方案3】:

    首先检查本地存储,然后您可以使用扩展运算符进行迭代

      function addNewShow(titleArg, typeArg, genreArg, watchedArg) {
      var showList = [];
    
      var show = {
        title: titleArg,
        type: typeArg,
        genre: genreArg,
        watched: watchedArg
      };
      showList.push(show);
      var finalArr = localStorage.getItem('showList') != undefined ? [...showList, ...JSON.parse(localStorage.getItem('showList'))] : showList;
      localStorage.setItem("showList", JSON.stringify(finalArr));
    };
    

    【讨论】:

    • 您的函数在第一次调用时将不起作用。它将 showList 设置为“”(包含空字符串序列化的字符串)而不是长度为 1 的数组,其中元素来自局部变量 show
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2020-11-05
    • 2011-08-21
    • 2021-07-18
    • 2021-09-22
    相关资源
    最近更新 更多